From ff9e2a0c9fd13f8e6b9187e6637b845b0c4464f4 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Tue, 17 Aug 2021 18:52:32 +0300 Subject: [PATCH 001/143] Updated Vision.puml --- docs/uml/Vision.puml | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index eccbb81f..7606396c 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -2,53 +2,49 @@ 'https://plantuml.com/class-diagram interface Vision -interface Solid +interface Solid{ + base of 3D geometries +} Vision <- Solid -class VisionGroup +class VisionGroup{ + a group of visions +} Vision <-- VisionGroup -class VisionBase +class VisionBase{ + basic vision + implementation +} Vision <- VisionBase class SolidLabel Solid <--- SolidLabel -SolidBase <-- SolidLabel class SolidGroup Solid <--- SolidGroup VisionGroupBase <-- SolidGroup -class SolidBase -Solid <--- SolidBase -VisionBase <-- SolidBase - class SphereLayer -SolidBase <-- SphereLayer GeometrySolid <-- SphereLayer class Sphere -SolidBase <-- Sphere GeometrySolid <-- Sphere class Box -SolidBase <-- Box Hexagon <-- Box class GenericHexagon -SolidBase <-- GenericHexagon Hexagon <-- GenericHexagon class Extruded -SolidBase <-- Extruded GeometrySolid <-- Extruded class PolyLine Solid <--- PolyLine -SolidBase <-- PolyLine interface GeometrySolid Solid <--- GeometrySolid @@ -66,19 +62,14 @@ GeometrySolid <-- ConeSurface class Convex Solid <--- Convex -SolidBase <-- Convex class Composite Solid <--- Composite -SolidBase <-- Composite interface SolidReference VisionGroup <---- SolidReference -interface MutableVisionGroup -VisionGroup <---- MutableVisionGroup - class SolidReferenceGroup VisionGroup <-- SolidReferenceGroup Solid <-- SolidReferenceGroup @@ -93,8 +84,6 @@ SolidReference <-- ReferenceChild class VisionGroupBase VisionBase <-- VisionGroupBase -MutableVisionGroup <-- VisionGroupBase - class RootVisionGroup -- 2.34.1 From becae94d3e4332fc8448535557083e334516e10d Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Tue, 17 Aug 2021 19:07:28 +0300 Subject: [PATCH 002/143] Updated Vision.puml ver.2 --- docs/uml/Vision.puml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 7606396c..fea56fb2 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -1,6 +1,10 @@ @startuml 'https://plantuml.com/class-diagram -interface Vision +interface Vision{ + val parent: VisionGroup? + fun getProperty(name):TypedMetaItem? + fun setProperty(name, item) +} interface Solid{ base of 3D geometries @@ -24,7 +28,7 @@ Solid <--- SolidLabel class SolidGroup Solid <--- SolidGroup -VisionGroupBase <-- SolidGroup +MutableVisionGroup <-- SolidGroup class SphereLayer @@ -70,6 +74,9 @@ Solid <--- Composite interface SolidReference VisionGroup <---- SolidReference +interface MutableVisionGroup +VisionGroup <---- MutableVisionGroup + class SolidReferenceGroup VisionGroup <-- SolidReferenceGroup Solid <-- SolidReferenceGroup @@ -82,12 +89,9 @@ Solid <-- ReferenceChild SolidReference <-- ReferenceChild -class VisionGroupBase -VisionBase <-- VisionGroupBase - class RootVisionGroup -VisionGroupBase <-- RootVisionGroup +MutableVisionGroup <-- RootVisionGroup class VisionOfPlotly -- 2.34.1 From ad3fdeab281ee521cf8fa4982be191eb3233e343 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Tue, 17 Aug 2021 20:23:31 +0300 Subject: [PATCH 003/143] changed hierarchy.md --- docs/hierarchy.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/hierarchy.md b/docs/hierarchy.md index a4097221..dbb2c6c1 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -1,7 +1,6 @@ # Hierarchy -![](../docs/images/hierarchy.png) -**the image will be changed** +![](../docs/images/hierarchy.png) ### Vision -- 2.34.1 From 86ab88cde02ac312783ccbc1378ecd419d1d5b60 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Tue, 17 Aug 2021 20:24:05 +0300 Subject: [PATCH 004/143] changed hierarchy.md --- docs/images/hierarchy.png | Bin 27217 -> 100407 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/hierarchy.png b/docs/images/hierarchy.png index e202c6afaa746ea54011d46fe48f1d0faae43c5a..91da7d4ba5c68450d12c3392375dbe0ce34d6b23 100644 GIT binary patch literal 100407 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%0DOa6IVCL*DyiLD zHjHJLK(2|;pw$A@m;&PQ>_^QW60QuS0vQ4JF7s=?P!$!rf&?CNSB$|cw0`NQuLtjE zss`jF{ViXSGyp|A0yamM*r0fj;WMDN>>p|QZUFiK?`)7vP66Ny5VB+vZ?cTyY!1E? zhqv4_Zd|M9m5?O#<$;oMTXE2hl}8KR*uGFB2rg(Lc+D_AHxX;)PE^m8UC4M@TLNpO zqpP?%hXbtG<~-7_Lyxfi>4kOHOVD=$9wBBWNwghwW2wHu5?i9rfDvJSJ!gC?(nW~; zx-^`MX<7cdwXID;TzqqD3w&~KXlSkP?s+gUK*67+*v6Wwn7Udl)!Z zzzzUyZFT6GYP{CSaj|sC2+~8GhF<8ZjE6qaszuEZ8lfekL%R%6|Bj(}ifxZ)d18a z668xh!@^NoaI2b`J8x5k_Bc5^pIu*vZj@wgq@zCLP0$KHY8wQ==zaTotDc7Gc{u8- zHz};tvTEeUgI4~p7~zDFp&1fzNdM2FklmEt(A6gz^9$adf!(sJ`9eSWNlPV&;ooB8 ztBcH@AoNfX$gWu>HbFKOpVY_I?r)bMmTs@X>vt*;*v3x1FEf!sL!VcDfkr*ye=|PS zD-&53Oc?s{NayXs^@GkQa?=ljTNkNYg1pWYLN~( zb77+d=!zhuU8KIM_N+gd8BSu;VSWLxMM+7iqocEZvLr&WcADG&7P=fzy+K(l=E!Wgr9BmrC2{#p8_LqIZ^d{fzsj}o`c+o0k*7<1 zZ&c@Z&f5`OHOL35NA`=URb`;gQ9`BJ2*l62E0*?_*K=V4e_|LSJ&S0Uhav%Y0t)r) z;!*Rm1TGM_fVk9MDNSVcoWz31h>Zf$wE5bWUf6ViIl5(5>pZ0;a)=m~(nmsOLfB=x z3snJeUuUFag#YJI)5|fhM1-eqQxyfIJtyg1i{hLpfj8U?$%Zh z0Y$av*>*Vii;q|T^hxNZrJXw97ST}!E2#IIH{<(_c#Du{P8$0z#K5$9VW0sVN6U+u z`j2WG*!x_6+|~3gJIV(}t{;cD`<4JmLB0jtk zYBlj=^G6*kQR(X!aboc_)t*d=gF5y^dUoxzg+HCU-E!y(*{?QHfm;po2%#q(kQedd zS1NeUho1}}ys?bu*0XH>p;alh1rI*YJ;i-5|) z=P^2LRuD~kzy*Vjdn|sQp=e z8!uf%ak1->C@)(V^4143*K@=NolM(b3msN3(TsDy%M$9;#e@D3NOnM_DiCR)v_pee z8Yl4*{g2f*+8)X9epE@O;@%+ie(@+)GE$gtG*s(hK2=EV^E?A#+|GlM!6kko%FIa^ z&v{L=l<&To@n2v<5*CUWXmGHm>i}dxS^#hl9Vy3Rg#Kw@94rXWin|%u7MX!Jb`5Pa z1B3n#?=EEUSGk#X<3vr4SVeBf@XTeN96gYyK`7^?TVw`u(7sK8Vkonf&U&`*y2+DG zm!FT(J@tzvbBntNp%qc762`d~nL1fAl`+E9y7fB#T`S|*Zm zL|Fg*q|Y!Q*`KNhwyXb}m!^@fSZZSUW|lTkNB9))+qgKwYhMRN+K&=^*E7J;^*LgtUQt0s)T4d4bK+r_kr*%J|jR*fVP)?trRy9Wz4 zt((nX>oxI;QwRLG-Eop63u|3CWjNx{`i&0C^zqXz8&c-S(KpHNPEHj}D>Ey)2r zLLUm9yy(sgj#5H+?Z$g+Q5t7JI}c;32)crVA3{_8B*taqH~NBmtcndJo^Sw$PJd0G zQIhpWYt@FgBcP{Bjm+)BN9aY z_SW;elhE-@QG>EFU2d-%=OeFcjJnS+CChE+l~|;lIC(@$OYg2rx#tO(RcwnTOl#Q2 zQ@M5Sjfm6IY-~E}59vIX+r6uz$2643-$EcFw6w=9ZftsOo=U^^I6Q;Yr5GwHaYr1k zZ6K%?p=H-V!zE(&19Iwx72ZXgY~MGzE;q7RnB7tt&v;IGA9r#a826XfowXI#iP7J- z+0n$yqsh`FdpHEWSy#8CPH46F2%QXZ>ESL^$`GSDd^P+=uVxhU z7qh)*xwAnm;~(7}N&wai2(}Gk@&ROrcWA@&+2ARjf+M6!xpyFWuq3klBUIj=Je-9> z05W*Err|C~lgx{@Vcj|1teEypJ%~Tbu*ecVBA5ULKdHwv} z4SePJRNHK+-TP0zyr2{t26Ec5RB6fM?c`f>w3k!kGZ(Ez%k_4VJa)S5uKR=&^oqBy zU&k`}-2NIC{OO;*T0WWEar<`*vrw5lEyWs1P8)n}d)=GTM;^Ra;^^c_|HA#;!h5pj zc!htV&bCm*yIJCsRI+xNd`~Fm?PH_ zo)k8Y$G*3FKXQJs7^u6r%}>ewjrvL|c@p6$IgueM%I|2LY1q~rPJdGSsbbrn=7y4B z3{MThOyXmJKpqdS)w_S!Dla=n0MuQOjL?Vh{^Cc9v-p)O#4~HY@7Y5B74KF$jz?Pc zMLeu1lSJVYhzEnNuyo2<2F}i}K}%0XyyT+C_OU%o6iqg<0?R)}mVo=XeBghdemk+r z;`PZ(RwEyNcGhV0$>`mVP>ctAi;pm{l#@%DCmrO+ThqzK{)q41bVhEQt;JA2NDlRe zuV;#Ols7NU_iULYv1W$%R+)ALW2~(y4-E-@Jk*B8PLLtzwa07KP?;De6K-BuSSc$y z75L?!|6&$Natcrp}U9hiw@`Wucc5TMPm9Qe0 zzE5}LyKtF!?Lba=c#zBL^vucNsqHtGUBIh5Meo^3lxlb0=~)&H^dLW-p_!P_Z7>}k+T*`y zE-HCM@g@2e_kB<-oa~Lfd`;6QkHYqL0U`TYZXF$i`3b`HuXRo9R&{~jx!;=Ed2h9x zw96a$)YUT3UUN*(G#DaPR8X6gh|3Lkp9gGYXz#I|bV+o=9OPgO8xuiXoCCDnm zCGk#`eL5|*?ZI5JxKxSkuo$^$sWw*~{Q6*#Ct|wq{0oSTKvt4XRMP%36UdgLvG>;X zBMixu!lG{!a?s~T-i&MJa`PZ+dk2i5_eS}tt?Pu&;62e!CrfqlZ$Pe7#=gSTweDmf zR-(FwwEe~+dEj=hkX+&r=8LV(C(0nd-Oa~`9^1JQd|^`9ydZcb;|+O|77YwL%P=Q|>QGI41=-#mevPf3Ln{`7F-TT=3gLN`zu zJ|bliVNwhJGucDpcWc$z?eaO%?B9nen9&-St)*wPIU9E)MkL}g2HO+2JlGGJ|cIR-DgMwnuJaDzQ$5{aL@@WygVcO9VYb^+WC%Ri>GTtQCe;;9$ZODp#JquLJU59-bBj(K&DCQ7K))bH^1V~Prk>TdN1SCN69f04Tme~F$arV7=4 zaS2MOKR*KmUz`9mECIYmT%aWa5xlbnjj6H(K-C%pExiuNHT)h*fY1W)zM!p^8hxbe zIFuHsl7Mwls0FAB7Ei?iHv%L&O?sQ9oDmhZ!YwBFgwb)wvz#0oIlXVS-M?FoJA-0} zNlvy{Zx@?5dl`(%{bt*_GU9iKAH=|$L`b_;d%AavlS z?Z37y^svP5`1Rw=!1}i@w9DF!SmKrVOB-nzH~a#e68sZoXPHf&GOL)=~7Z%SIG%Z?pfV? zw`EUOTKisL)#YS7E@~Qn8?VFXdk7jJ02ejv9!zXp0V}(8dIq>RCMxo&iE$;hB%q%t zYfl}|%71joqG9f;{$kNw1!rxH@o#8kB;P~4%l1*E;M1VEf2Yae5D1Ru`TJn`V|o3B zm9-IeCt3=(o%kkDCtK?~9Z67Vzb^9q!`=v}ZPah)BHqP$-)WMGv`WvoY)QA_((`l% z!oYdrzu=i0K3wleavvQ3`zKdQCk>ULKGL2qk|+o={MEWE5WGe#k}3sL^b@%_wG)!l z^t8J7)nRWKcHq_)OW)?r`EtF35gMj|+hc9f0A!(7G;;Tj`)D837Nz(2H`n zMt7%B_fm#GLP?b!WJ~vb!HRj%RAnk`JSTrO zIVz?S8J_|0x(4)~-=gh_sjZs}@@&Lz-b6xzAkuuxjBq(8Dl_hVO%rq~&$E6Yx0$rj zbc&Lbgj4rL zu|7|$pEIly*W+@MmOtS2x?Aop2*1X;G*PZckNh=AF*0st zg)AYVvC^m#)mNr=c(B!DIs}s(57$&x^{4B}S~hr_b$*_5b z_!~_|pZ+v8)}FR|Grf%_p)!0;V{>Yg)B2@gC#cO!O9OHPn2JqrSl6gxJl%u)>4uHF z7{+g#LZ!^GA;<_|)@JzL5rxXioq>Qp?H-gC7B0`s-t-6xIU3^!eacA~1sou9SgrOp zfTbhiJ3H>*nbV4_!tx_%@eZW&L;z15rFd)vnox0CvAIpM%?{ekS^&N4Pn?~cYRb#t z@|9u#9>QFwc$nb8Q~3=@V}EhcZ@Ln<}fPh`$Z?MG8vR87~R^_u%`Z zh+Y4lrq*($J=|%vJw19+slLbO=5v8Sp1vhdm)PDu-u)C4V_UA~xh5|EXf=!NeLl+W z_&p>9sc#xi&l_A}n*HtE@4~#G(KmBi0aFfm?hkZSZcv(aMhT2i>nYu^Wz#WH%a!`{ zDe86Z0dV6%1Q~@hA+$^2e(2>3);xdJnHLFQ!l#&tks6(g`fQ*rOyV;``(1OfPa&`} zLDLxa=GE|I?}r%s;WxSot+$t*Eo6 zK;b1^CBMx~5)2GmY8no16Bb<;s?YT*!Q33Lq;k+Tb2UnuNVL0HS1{`G&-D8f->3Of ztp=$`E;u-12{w~y8|2B_ta?L0u3@rs+uLtfTYS-oW(acl{&>4nO2y*$AqW50oYIP_ zeI-?fcfH&zPy!0le=`UbeA@Q-zW^Hp(F1D84nXNs#;-=B2cV%x9LK+-Rh5_99Lo^S zcloU>`fyxjmtLZ#spJuHJ zYi8(XjmW!bkO`o9(0S8G5Y?}J{WZtW3OEM}@@`X|Twprn5=1fpz3OJE0nUL;Vn1Nq zph!;(eWHS;%%%wAR7+|bEi-4nnA`FF)wGJ~608Vesgj+#xSS;y;+s+l&#kUBz$!cLhaAT=t(PRlh#Ib;M)0_i=6Q zV_Nq=^&_D%b|~RJFj~~i`G9 z=OKFo-lV<66mXO#j`c_KHSJ3)NYBl_o%iq9V~-LGQ2%ImLPX(tzU&9n21EoFS8x;( z6R>7xLqQe>%xV0X3$10~5jUv_%mniDPCDe%3(_GM3>rZhbkM-O+K!H4dBFMm;wmfU zWIriOR0#C}XY!R3HM=|egCkXXrTxig6)Qo{*V9^M)E7vAD^a;_Y~uO$BnYZ3JGJ`5 z1|7_(kr0}SS~P)37h#p4^BuzlhUK-!aQzh(IvUOL5ULNgT0Sk%7L{;)=^;y7pbmii zv|2to3mm1@Bk`5aedAZCcGx*><6@T2Us{2(R^4Du;}^9gEo(*#*$CVGR6*K$lOrx= zf0SEM#0o;wt! z?agfziy=CR=bn1<)$i3aXg|-OW~BMj<%*#tsX48G4oF>7Wh*mDn(%gfmWyvWe}&^) zoAM!KWP@M?ic2JrcXR_Y&MQBau~4PE|(F=lT8TBL~FRw|`hju@}kuB$O}Y%XvyxkU#s>l;izW!l&3q z1rA9TJ2_G|C-lb@tAJ#l&uKJp96>%^9%w@~Q}MSWOVyQhXvzl>=4}*4OWQ4>Z@#A= zyg4YLIx6I#O`Da7GBS`SvXV7WeF-m=Hw2G!qRpqop7qut}hYddmm`xW&l$pH&8Ba&HfBJAfjK1xVx^3b5+;^|y(Bo!JvNXA? z7{b3Hwĝ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 literal 27217 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 F{{WiZ#M1x( -- 2.34.1 From a15afb3d52cb9c1e9e46c2b4d831f1eb1e8cf380 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 15:29:02 +0300 Subject: [PATCH 005/143] Fix width in GDML demo --- .../space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 2bad5e8d..4c4fc43c 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -3,9 +3,7 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.window import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred -import kotlinx.css.height -import kotlinx.css.pt -import kotlinx.css.vh +import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get @@ -71,6 +69,7 @@ val GDMLApp = functionalComponent("GDMLApp") { props -> styledDiv { css { height = 100.vh - 12.pt + width = 100.vw } child(ThreeCanvasWithControls) { attrs { -- 2.34.1 From b79265e8c2fd0eb59c3ad50973f19fdd883c6ff9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 23:02:17 +0300 Subject: [PATCH 006/143] WIP Root object model --- build.gradle.kts | 8 +- cern-root-loader/build.gradle.kts | 19 +++ .../kotlin/ru/mipt/npm/root/RootModel.kt | 25 ++++ .../kotlin/ru/mipt/npm/root/TGeoHMatrix.kt | 33 ++++++ .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 30 +++++ .../kotlin/ru/mipt/npm/root/TGeoMaterial.kt | 9 ++ .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 10 ++ .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 17 +++ .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 80 +++++++++++++ .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 22 ++++ .../kotlin/ru/mipt/npm/root/TObject.kt | 22 ++++ .../src/main/kotlin/gravityDemo.kt | 6 +- .../src/main/kotlin/markupComponent.kt | 2 +- settings.gradle.kts | 1 + .../ThreeViewWithControls.kt | 8 +- visionforge-gdml/build.gradle.kts | 1 - .../visionforge/gdml/GdmlLoaderOptions.kt | 95 +++++++++++++++ .../{GdmlTransformer.kt => gdmlLoader.kt} | 110 ++---------------- .../kscience/visionforge/gdml/gdmlJVM.kt | 2 +- 19 files changed, 390 insertions(+), 110 deletions(-) create mode 100644 cern-root-loader/build.gradle.kts create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt create mode 100644 visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt rename visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/{GdmlTransformer.kt => gdmlLoader.kt} (80%) diff --git a/build.gradle.kts b/build.gradle.kts index 5b093e09..505c349c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,9 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -//workaround for https://youtrack.jetbrains.com/issue/KT-48273 -rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.webpackDevServer.version = "4.0.0-rc.0" + +afterEvaluate { + extensions.configure { + versions.webpackDevServer.version = "4.0.0" + } } \ No newline at end of file diff --git a/cern-root-loader/build.gradle.kts b/cern-root-loader/build.gradle.kts new file mode 100644 index 00000000..fa26fab5 --- /dev/null +++ b/cern-root-loader/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") +} + +kscience{ + useSerialization { + json() + } +} + +kotlin { + sourceSets { + val commonMain by getting { + dependencies { + api(project(":visionforge-solid")) + } + } + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt new file mode 100644 index 00000000..8f53d71f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt @@ -0,0 +1,25 @@ +package ru.mipt.npm.root + +import kotlin.properties.PropertyDelegateProvider +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +public interface RootValueProvider { + /** + * Provide a member cast or reinterpreted to given type. + * Returns null if member with given name/type could not be resolved. + */ + public fun provideOrNull(name: String, type: KType): T? +} + +public interface RootModel { + public val provider: RootValueProvider +} + +public inline fun RootValueProvider.provide(name: String): T = + provideOrNull(name, typeOf()) ?: error("A member with type ${T::class} and name $name could not be resolved") + +public inline fun RootModel.member(name: String? = null): PropertyDelegateProvider> = + PropertyDelegateProvider { _, property -> + lazy { provider.provide(name ?: property.name) } + } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt new file mode 100644 index 00000000..f70e9a24 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt @@ -0,0 +1,33 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + + +@Serializable +public sealed class TGeoMatrix : TNamed() + +@Serializable +public class TGeoIdentity : TGeoMatrix() + +@Serializable +public class TGeoHMatrix( + public val fTranslation: DoubleArray, + public val fRotationMatrix: DoubleArray, + public val fScale: DoubleArray +) : TGeoMatrix() + +@Serializable +public class TGeoTranslation( + public val fTranslation: DoubleArray +) : TGeoMatrix() + +@Serializable +public class TGeoRotation( + public val fRotationMatrix: DoubleArray +): TGeoMatrix() + +@Serializable +public class TGeoCombiTrans( + public val fTranslation: DoubleArray, + public val fRotation: TGeoRotation? = null, +): TGeoMatrix() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt new file mode 100644 index 00000000..2dcf5598 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -0,0 +1,30 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject + +@Serializable +public class TGeoManager : TNamed() { + + public val fMatrices: TObjArray = TObjArray.empty + public val fShapes: TObjArray = TObjArray.empty + public val fVolumes: TObjArray = TObjArray.empty + + + companion object { + public val rootJson: Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + } + + + /** + * Load Json encoded TGeoManager + */ + public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + } +} + + diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt new file mode 100644 index 00000000..9094d721 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt @@ -0,0 +1,9 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public open class TGeoMaterial: TNamed() + +@Serializable +public class TGeoMixture: TGeoMaterial() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt new file mode 100644 index 00000000..196c209c --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -0,0 +1,10 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public class TGeoMedium( + public val fId : Int, + public val fMaterial: TGeoMaterial, + public val fParams: DoubleArray +): TNamed() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt new file mode 100644 index 00000000..2793773f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -0,0 +1,17 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public class TGeoNode : TNamed() { + //val fGeoAtt: UInt + public val fVolume: TGeoVolume? = null + public val fMother: TGeoVolume? = null + public val fNumber: Int = 0 + public val fNovlp: Int = 0 + public val fOverlaps: IntArray = intArrayOf() +} + +public class TGeoNodeMatrix : TGeoMatrix() { + public val fMatrix: TGeoMatrix? = null +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt new file mode 100644 index 00000000..344f5e6f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -0,0 +1,80 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public abstract class TGeoShape : TNamed() { + public val fShapeBits: UInt = 0u + public val fShapeId: Int = 0 +} + +@Serializable +public open class TGeoBBox : TGeoShape() { + public val fDX: Double = 0.0 + public val fDY: Double = 0.0 + public val fDZ: Double = 0.0 + public val fOrigin: DoubleArray = doubleArrayOf(0.0, 0.0, 0.0) +} + +@Serializable +public sealed class TGeoBoolNode : TObject() { + public abstract val fLeft: TGeoShape + public abstract val fLeftMat: TGeoMatrix + public abstract val fRight: TGeoShape + public abstract val fRightMat: TGeoMatrix +} + +@Serializable +public class TGeoUnion( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + +@Serializable +public class TGeoSubtraction( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + +@Serializable +public class TGeoIntersection( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + + +@Serializable +public class TGeoCompositeShape(public val fNode: TGeoBoolNode) : TGeoBBox() + +@Serializable +public class TGeoXtru( + public val fNvert: Int, + public val fNz: Int, + public val fZcurrent: Double, + public val fX: DoubleArray, + public val fY: DoubleArray, + public val fZ: DoubleArray, + public val fScale: DoubleArray, + public val fX0: DoubleArray, + public val fY0: DoubleArray +) : TGeoBBox() + + +@Serializable +public class TGeoTube( + public val fRmin: Double, + public val fRmax: Double, + public val fDz: Double, +) : TGeoBBox() + +@Serializable +public class TGeoShapeAssembly( + public val fVolume: TGeoVolumeAssembly, + public val fBBoxOK: Boolean = true +): TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt new file mode 100644 index 00000000..1bd12cbf --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -0,0 +1,22 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public open class TGeoVolume : TNamed(){ + // "fGeoAtt" : 3084, +// "fLineColor" : 3, +// "fLineStyle" : 1, +// "fLineWidth" : 1, +// "fFillColor" : 19, +// "fFillStyle" : 1001, + public lateinit var fNodes: TObjArray + public lateinit var fShape: TGeoShape + public lateinit var fMedium: TGeoMedium + public val fNumber: Int = 1 + public val fNtotal: Int = 1 + public val fRefCount: Int = 1 +} + +@Serializable +public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt new file mode 100644 index 00000000..fb17d8ac --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -0,0 +1,22 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public abstract class TObject { + public val fUniqueID: UInt = 0u + public val fBits: UInt = 0u +} + +@Serializable +public abstract class TNamed : TObject() { + public val fName: String = "" + public val fTitle: String = "" +} + +@Serializable +public class TObjArray(public val arr: List){ + public companion object{ + public val empty = TObjArray(emptyList()) + } +} \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index e8ea5856..eec16afe 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -6,6 +6,7 @@ import react.RProps import react.child import react.functionalComponent import space.kscience.dataforge.context.Context +import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.react.flexRow @@ -91,7 +92,10 @@ val GravityDemo = functionalComponent { props -> height = 50.vh - 50.pt } plotly { - traces(velocityTrace) + traces(velocityTrace,energyTrace) + layout { + xaxis.title = "time" + } } Markup { attrs { diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 5a5f6df2..879ab3df 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -32,7 +32,7 @@ val Markup = functionalComponent("Markup") { props -> //TODO add new formats via plugins else -> error("Format ${vision.format} not recognized") } - vision.useProperty(VisionOfMarkup::content) { content -> + vision.useProperty(VisionOfMarkup::content) { content: String? -> element.clear() element.append { markdown(flavour) { content ?: "" } diff --git a/settings.gradle.kts b/settings.gradle.kts index d4616ea7..7303d884 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,6 +32,7 @@ include( ":visionforge-threejs", ":visionforge-threejs:visionforge-threejs-server", ":visionforge-gdml", + ":cern-root-loader", ":visionforge-server", ":visionforge-plotly", ":visionforge-markdown", diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index e69b04c9..94f02fdd 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -13,9 +13,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.* import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow @@ -85,7 +83,9 @@ public val ThreeCanvasWithControls: FunctionComponent Action = { Action.PROTOTYPE } + public var volumeAction: (GdmlGroup) -> Action = { Action.PROTOTYPE } + + internal val styleCache = HashMap() + + public fun Solid.registerAndUseStyle(name: String, builder: MutableMeta.() -> Unit) { + styleCache.getOrPut(Name.parse(name)) { + Meta(builder) + } + useStyle(name) + } + + public fun Solid.transparent() { + registerAndUseStyle("transparent") { + SolidMaterial.MATERIAL_OPACITY_KEY put 0.3 + "edges.enabled" put true + } + } + + /** + * Configure paint for given solid with given [GdmlMaterial] + */ + public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = + { material, _ -> color(randomColor(material)) } + private set + + public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { + configurePaint = block + } + + /** + * Configure given solid + */ + public var configureSolid: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit = + { parent, solid, material -> + val styleName = "materials.${material.name}" + + if (parent.physVolumes.isNotEmpty()) transparent() + + registerAndUseStyle(styleName) { + val vfMaterial = SolidMaterial().apply { + configurePaint(material, solid) + } + SolidMaterial.MATERIAL_KEY put vfMaterial.toMeta() + "Gdml.material" put material.name + } + } + private set + + public fun configure(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { + val oldConfigure = configureSolid + configureSolid = { parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial -> + oldConfigure(parent, solid, material) + block(parent, solid, material) + } + } + + + public companion object { + private val random: Random = Random(222) + + private val colorCache = HashMap() + + /** + * Use random color and cache it based on the material. Meaning that colors are random, but always the same for the + * same material. + */ + public fun randomColor(material: GdmlMaterial): Int { + return colorCache.getOrPut(material) { random.nextInt(16777216) } + } + } +} \ No newline at end of file diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt similarity index 80% rename from visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt rename to visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 284d80cf..8eca342c 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -1,7 +1,5 @@ package space.kscience.visionforge.gdml -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -11,10 +9,8 @@ import space.kscience.gdml.* import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.solid.* -import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import kotlin.math.cos import kotlin.math.sin -import kotlin.random.Random private val solidsName = "solids".asName() private val volumesName = "volumes".asName() @@ -25,91 +21,7 @@ private inline operator fun Number.times(d: Double) = toDouble() * d @Suppress("NOTHING_TO_INLINE") private inline operator fun Number.times(f: Float) = toFloat() * f -public class GdmlTransformer { - - public enum class Action { - ADD, - REJECT, - PROTOTYPE - } - - public var lUnit: LUnit = LUnit.MM - public var aUnit: AUnit = AUnit.RADIAN - - public var solidAction: (GdmlSolid) -> Action = { Action.PROTOTYPE } - public var volumeAction: (GdmlGroup) -> Action = { Action.PROTOTYPE } - - internal val styleCache = HashMap() - - public fun Solid.registerAndUseStyle(name: String, builder: MutableMeta.() -> Unit) { - styleCache.getOrPut(Name.parse(name)) { - Meta(builder) - } - useStyle(name) - } - - public fun Solid.transparent() { - registerAndUseStyle("transparent") { - SolidMaterial.MATERIAL_OPACITY_KEY put 0.3 - "edges.enabled" put true - } - } - - /** - * Configure paint for given solid with given [GdmlMaterial] - */ - public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = - { material, _ -> color(randomColor(material)) } - private set - - public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { - configurePaint = block - } - - /** - * Configure given solid - */ - public var configureSolid: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit = - { parent, solid, material -> - val styleName = "materials.${material.name}" - - if (parent.physVolumes.isNotEmpty()) transparent() - - registerAndUseStyle(styleName) { - val vfMaterial = SolidMaterial().apply { - configurePaint(material, solid) - } - MATERIAL_KEY put vfMaterial.toMeta() - "Gdml.material" put material.name - } - } - private set - - public fun configure(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { - val oldConfigure = configureSolid - configureSolid = { parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial -> - oldConfigure(parent, solid, material) - block(parent, solid, material) - } - } - - - public companion object { - private val random: Random = Random(222) - - private val colorCache = HashMap() - - /** - * Use random color and cache it based on the material. Meaning that colors are random, but always the same for the - * same material. - */ - public fun randomColor(material: GdmlMaterial): Int { - return colorCache.getOrPut(material) { random.nextInt(16777216) } - } - } -} - -private class GdmlTransformerEnv(val settings: GdmlTransformer) { +private class GdmlLoader(val settings: GdmlLoaderOptions) { //private val materialCache = HashMap() /** @@ -356,13 +268,13 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { ): Solid? { require(name != "") { "Can't use empty solid name. Use null instead." } return when (settings.solidAction(solid)) { - GdmlTransformer.Action.ADD -> { + GdmlLoaderOptions.Action.ADD -> { addSolid(root, solid, name) } - GdmlTransformer.Action.PROTOTYPE -> { + GdmlLoaderOptions.Action.PROTOTYPE -> { proxySolid(root, this, solid, name ?: solid.name) } - GdmlTransformer.Action.REJECT -> { + GdmlLoaderOptions.Action.REJECT -> { //ignore null } @@ -388,14 +300,14 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { } when (settings.volumeAction(volume)) { - GdmlTransformer.Action.ADD -> { + GdmlLoaderOptions.Action.ADD -> { val group: SolidGroup = volume(root, volume) this[physVolume.name] = group.withPosition(root, physVolume) } - GdmlTransformer.Action.PROTOTYPE -> { + GdmlLoaderOptions.Action.PROTOTYPE -> { proxyVolume(root, this, physVolume, volume) } - GdmlTransformer.Action.REJECT -> { + GdmlLoaderOptions.Action.REJECT -> { //ignore } } @@ -460,16 +372,16 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { } -public fun Gdml.toVision(block: GdmlTransformer.() -> Unit = {}): SolidGroup { - val settings = GdmlTransformer().apply(block) - val context = GdmlTransformerEnv(settings) +public fun Gdml.toVision(block: GdmlLoaderOptions.() -> Unit = {}): SolidGroup { + val settings = GdmlLoaderOptions().apply(block) + val context = GdmlLoader(settings) return context.transform(this) } /** * Append Gdml node to the group */ -public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlTransformer.() -> Unit = {}) { +public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoaderOptions.() -> Unit = {}) { val visual = gdml.toVision(transformer) //println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual)) set(key, visual) diff --git a/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt b/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt index b67e231e..ed854100 100644 --- a/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt +++ b/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt @@ -9,7 +9,7 @@ public fun SolidGroup.gdml( file: Path, key: String = "", usePreprocessor: Boolean = false, - transformer: GdmlTransformer.() -> Unit = {}, + transformer: GdmlLoaderOptions.() -> Unit = {}, ) { val gdml = Gdml.decodeFromFile(file, usePreprocessor) gdml(gdml, key, transformer) -- 2.34.1 From 6ff3a0427822d8aab113e07caf6e563de35c64b8 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 19 Aug 2021 09:56:20 +0300 Subject: [PATCH 007/143] WIP Root object model --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 49 +- .../src/commonTest/resources/BM@N.root.json | 26920 ++++++++++++++++ 2 files changed, 26961 insertions(+), 8 deletions(-) create mode 100644 cern-root-loader/src/commonTest/resources/BM@N.root.json diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 2dcf5598..26517477 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,8 +1,9 @@ package ru.mipt.npm.root -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.modules.SerializersModule @Serializable public class TGeoManager : TNamed() { @@ -10,14 +11,9 @@ public class TGeoManager : TNamed() { public val fMatrices: TObjArray = TObjArray.empty public val fShapes: TObjArray = TObjArray.empty public val fVolumes: TObjArray = TObjArray.empty - - companion object { - public val rootJson: Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - } + + public companion object { /** @@ -27,4 +23,41 @@ public class TGeoManager : TNamed() { } } +@OptIn(ExperimentalSerializationApi::class) +private class RootJsonSerialFormat : StringFormat { + override val serializersModule: SerializersModule get() = json.serializersModule + + private val refCache: HashMap = HashMap() + + override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { + val match = refRegex.matchEntire(string) + return if (match != null) { + //Do unref + val ref = match.value.toUIntOrNull() ?: error("Ref value is not a number") + val refValue = refCache[ref] ?: error("Reference $ref unresolved") + refValue as T //TODO research means to make it safe + } else { + val res = json.decodeFromString(deserializer, string) + val uid = (res as? TObject)?.fUniqueID + if (uid != null && refCache[uid] == null) { + refCache[uid] = res + } + res + } + } + + override fun encodeToString(serializer: SerializationStrategy, value: T): String = + json.encodeToString(serializer, value) + + companion object { + val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() + + val json: Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + } + } + +} diff --git a/cern-root-loader/src/commonTest/resources/BM@N.root.json b/cern-root-loader/src/commonTest/resources/BM@N.root.json new file mode 100644 index 00000000..9058d156 --- /dev/null +++ b/cern-root-loader/src/commonTest/resources/BM@N.root.json @@ -0,0 +1,26920 @@ +{ + "_typename" : "TGeoManager", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "FAIRGeom", + "fTitle" : "FAIR geometry", + "fNNodes" : 413815, + "fVisDensity" : 0, + "fExplodedView" : 0, + "fVisOption" : 1, + "fVisLevel" : 3, + "fNsegments" : 20, + "fNtracks" : 0, + "fMaxVisNodes" : 10000, + "fNpdg" : 257, + "fPdgId" : [1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 11, -11, 12, -12, 13, -13, 14, -14, 15, -15, 16, -16, 17, -17, 18, -18, 21, 22, 23, 24, -24, 25, 28, 29, 32, 33, 34, -34, 35, 36, 37, -37, 38, 39, -39, 40, -40, 51, 52, -52, 53, 54, 55, -55, 56, 61, -61, 62, -62, 63, -63, 64, -64, 65, -65, 66, -66, 81, 82, -82, 83, 84, -84, 85, -85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 111, 113, 115, 130, 210, -210, 211, -211, 213, -213, 215, -215, 220, 221, 223, 225, 310, 311, -311, 313, -313, 315, -315, 321, -321, 323, -323, 325, -325, 330, 331, 333, 335, 411, -411, 413, -413, 415, -415, 421, -421, 423, -423, 425, -425, 431, -431, 433, -433, 435, -435, 440, 441, 443, 445, 511, -511, 513, -513, 515, -515, 521, -521, 523, -523, 525, -525, 531, -531, 533, -533, 535, -535, 541, -541, 543, -543, 545, -545, 551, 553, 555, 1103, -1103, 1114, -1114, 2101, -2101, 2103, -2103, 2110, -2110, 2112, -2112, 2114, -2114, 2203, -2203, 2210, -2210, 2212, -2212, 2214, -2214, 2224, -2224, 3101, -3101, 3103, -3103, 3112, -3112, 3114, -3114, 3122, -3122, 3201, -3201, 3203, -3203, 3212, -3212, 3214, -3214, 3222, -3222, 3224, -3224, 3303, -3303, 3312, -3312, 3314, -3314, 3322, -3322, 3324, -3324, 3334, -3334, 4101, -4101, 4103, -4103, 4112, -4112, 4114, -4114, 4122, -4122, 4132, -4132, 4201, -4201, 4203, -4203, 4212, -4212, 4214, -4214, 4222, -4222, 4224, -4224, 4232, -4232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fStreamVoxels" : false, + "fPhiCut" : false, + "fTimeCut" : false, + "fMatrices" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoIdentity", + "fUniqueID" : 1, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 2, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 3, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 4, + "fBits" : 52559872, + "fName" : "t5", + "fTitle" : "", + "fTranslation" : [0, -7.13984375, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 5, + "fBits" : 52559872, + "fName" : "t9", + "fTitle" : "", + "fTranslation" : [0, -4.7421875, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 6, + "fBits" : 52559872, + "fName" : "GlassLayer1PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -0.475] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 7, + "fBits" : 52559872, + "fName" : "GlassLayer2PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, 0.219] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 8, + "fBits" : 52559872, + "fName" : "G10LayerPosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, 0.642] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 9, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 0, 1052.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 10, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 11, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.65, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 12, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 13, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 14, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 15, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 16, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -49.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 17, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 18, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -48.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 19, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 20, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -49.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 21, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.55, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 22, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -48.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 23, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 24, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 25, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 26, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 27, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -46.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 28, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -45.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 29, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -46.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 30, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -45.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 31, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 32, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 33, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 34, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 35, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -43.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 36, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -42.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 37, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -43.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 38, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -42.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 39, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 40, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 41, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 42, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 43, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -40.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 44, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -39.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 45, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -40.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 46, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -39.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 47, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 48, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 49, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 50, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 51, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -37.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 52, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -36.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 53, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -37.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 54, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -36.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 55, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 56, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 57, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 58, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 59, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -34.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 60, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -33.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 61, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -34.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 62, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -33.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 63, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 64, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 65, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 66, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 67, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -31.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 68, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -30.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 69, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -31.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 70, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -30.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 71, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 72, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 73, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 74, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 75, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -28.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 76, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -27.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 77, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -28.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 78, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -27.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 79, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 80, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 81, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 82, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 83, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -25.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 84, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -24.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 85, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -25.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 86, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -24.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 87, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 88, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 89, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 90, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 91, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -22.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 92, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -21.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 93, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -22.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 94, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -21.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 95, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 96, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 97, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 98, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 99, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 100, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 101, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 102, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 103, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 104, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 105, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 106, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 107, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 108, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 109, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 110, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 111, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 112, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 113, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 114, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 115, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 116, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 117, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 118, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 119, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 120, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 121, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 122, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 123, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 124, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 125, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 126, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 127, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 128, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 129, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 130, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 131, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 132, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 133, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 134, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 135, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 136, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 137, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 138, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 139, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 140, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 141, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 142, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 143, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 144, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 145, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 146, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 147, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 148, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 149, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 150, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 151, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 152, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 153, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 154, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 155, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 156, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 157, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 158, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 159, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 160, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 161, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 162, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 163, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 164, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 165, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 166, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 167, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 168, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 169, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 170, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 171, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 172, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 173, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 174, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 175, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 176, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 177, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 178, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 179, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 180, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 181, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 182, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 183, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 184, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 185, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 186, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 187, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 188, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 189, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 190, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 191, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 192, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 193, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 194, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 195, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 196, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 197, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 198, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 199, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 200, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 201, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 202, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 203, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 204, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 20.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 205, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 206, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 20.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 207, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 21.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 208, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 209, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 21.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 210, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 211, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 212, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 23.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 213, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 214, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 23.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 215, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 24.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 216, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 217, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 24.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 218, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 219, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 220, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 26.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 221, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 222, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 26.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 223, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 27.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 224, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 225, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 27.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 226, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 227, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 228, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 29.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 229, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 230, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 29.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 231, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 30.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 232, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 233, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 30.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 234, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 235, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 236, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 32.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 237, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 238, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 32.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 239, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 33.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 240, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 241, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 33.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 242, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 243, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 244, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 35.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 245, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 246, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 35.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 247, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 36.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 248, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 249, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 36.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 250, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 251, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 252, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 38.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 253, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 254, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 38.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 255, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 39.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 256, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 257, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 39.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 258, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 259, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 260, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 41.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 261, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 262, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 41.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 263, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 42.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 264, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 265, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 42.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 266, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 267, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 268, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 44.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 269, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 270, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 44.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 271, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 45.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 272, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 273, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 45.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 274, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 275, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 276, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 47.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 277, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 278, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 47.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 279, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 48.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 280, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 281, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 48.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 282, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 283, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 284, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 285, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 286, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 287, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 288, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 289, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 290, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 291, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 292, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 293, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 294, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 295, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 296, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 297, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 298, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 299, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 300, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 301, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 302, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 303, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 304, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 305, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 306, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 307, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 308, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 309, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 310, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 311, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 312, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 313, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 314, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 315, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 316, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 317, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 318, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 319, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 320, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 321, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 322, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 323, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 324, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 325, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 326, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 327, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 328, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 329, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 330, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 331, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 332, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 333, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 334, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 335, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 336, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 337, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 338, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 339, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 340, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 341, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 342, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 343, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 344, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 345, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 346, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 347, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 348, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 349, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 350, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 351, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 352, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 353, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 354, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 355, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 356, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 357, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 358, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 359, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 360, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 361, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 362, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 363, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 364, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 365, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 366, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 367, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 368, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 369, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 370, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 371, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 372, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 373, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 374, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 375, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 376, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 377, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 378, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 379, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 380, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 381, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 382, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 45, 0] + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 383, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 384, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 385, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 386, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 387, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 388, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 389, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 390, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 391, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 392, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 393, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 394, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 395, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 396, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 397, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 398, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 399, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 400, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 401, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 402, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 403, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 404, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 405, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 406, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 407, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 408, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 409, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [27.7, 0, 0.55], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 410, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [-34.7, 0.2, 2.95], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 411, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [27.7, 0, 0.55], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 412, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [-34.7, 0.2, 2.95], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 413, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 414, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 415, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 416, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 417, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 418, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 419, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 420, + "fBits" : 62259200, + "fName" : "c413", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 421, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 422, + "fBits" : 62259200, + "fName" : "c416", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 423, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 424, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 425, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 426, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 427, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 428, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 429, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 430, + "fBits" : 62259200, + "fName" : "c423", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 431, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 432, + "fBits" : 62259200, + "fName" : "c426", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 433, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-29.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 434, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-28.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 435, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-26.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 436, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-25.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 437, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-24.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 438, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-23.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 439, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-21.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 440, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-20.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 441, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-19.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 442, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-18.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 443, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-16.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 444, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-15.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 445, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-14.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 446, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-13.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 447, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-11.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 448, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-10.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 449, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-9.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 450, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-8.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 451, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-6.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 452, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-5.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 453, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-4.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 454, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-3.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 455, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-1.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 456, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-0.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 457, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 458, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [1.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 459, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [3.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 460, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [4.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 461, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [5.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 462, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [6.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 463, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [8.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 464, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [9.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 465, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [10.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 466, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [11.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 467, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [13.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 468, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [14.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 469, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [15.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 470, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [16.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 471, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [18.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 472, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [19.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 473, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [20.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 474, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [21.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 475, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [23.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 476, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [24.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 477, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [25.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 478, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [26.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 479, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [28.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 480, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [29.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 481, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, -0.304499998688698] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 482, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, 0.304499998688698] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 483, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, -1.34000000357628] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 484, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, 1.34000000357628] + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 485, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -11.59375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 486, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -8.28125], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 487, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -4.96875], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 488, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -1.65625], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 489, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 1.65625], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 490, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 4.96875], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 491, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 8.28125], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 492, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 11.59375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 493, + "fBits" : 52559872, + "fName" : "t493", + "fTitle" : "", + "fTranslation" : [0, 0, -2.50375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 494, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, -1.50225], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [0.5, -0.866025403784439, 0, 0.866025403784439, 0.5, -0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 495, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, -0.50075], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-0.5, -0.866025403784439, 0, 0.866025403784439, -0.5, -0, 0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 496, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 0.50075], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1, -0, 0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 497, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 1.50225], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-0.5, 0.866025403784438, 0, -0.866025403784438, -0.5, -0, -0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 498, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 2.50375], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [0.5, 0.866025403784439, 0, -0.866025403784439, 0.5, -0, -0, 0, 1] + } + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 499, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-48, 0, 800] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 500, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 501, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.9] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 502, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 503, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.075] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 504, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 505, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 506, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 507, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 508, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 509, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 510, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 511, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 512, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 513, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 514, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 515, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 516, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 517, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 518, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 519, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 520, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 521, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 522, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 523, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 524, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 525, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 526, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 527, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 528, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 529, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 530, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 531, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 532, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 533, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 534, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 535, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 536, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 537, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 538, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 539, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 540, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 541, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 542, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 543, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 544, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 545, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 546, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 547, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 548, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 549, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 550, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 551, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 552, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 553, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 554, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 555, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 556, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 557, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 558, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 559, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 560, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 561, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 562, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 563, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 564, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 565, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 566, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 567, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 568, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 569, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 570, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 571, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 572, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 573, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 574, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 575, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 576, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 577, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 578, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 579, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 580, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 581, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 582, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 583, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 584, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 585, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 586, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 587, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 588, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 589, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 590, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 591, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 592, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 593, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 594, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 595, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 596, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 597, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 598, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 599, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 600, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 601, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 602, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 603, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 604, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 605, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 606, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 607, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 608, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 609, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 610, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 611, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 612, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 613, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 614, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 615, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 616, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 617, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 618, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 619, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 620, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 621, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 622, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 623, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 624, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 625, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 626, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 627, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 628, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 629, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 630, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 631, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 632, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 633, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 634, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 635, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 636, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 637, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 638, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 639, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 640, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 641, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 642, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 643, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 644, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 645, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 646, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 647, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 648, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 649, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 650, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 651, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 652, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 653, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 654, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 655, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 656, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 657, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 658, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 659, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 660, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 661, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 662, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 663, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 664, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 665, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 666, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 667, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 668, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 669, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 670, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 671, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 672, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 673, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 674, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 675, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 676, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 677, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 678, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 679, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 680, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 681, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 682, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 683, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 684, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 685, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 686, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 687, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 688, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 689, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 690, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 691, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 692, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 693, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 694, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 695, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 696, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 697, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 698, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 699, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 700, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 701, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 702, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 703, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 704, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 705, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 706, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 707, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 708, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 709, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 710, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 711, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 712, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 713, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 714, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 715, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 716, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 717, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 718, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 719, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 720, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 721, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 722, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 723, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 724, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 725, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 726, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 727, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 728, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 729, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 730, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 731, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 732, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 733, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 734, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 735, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 736, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 737, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 738, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 739, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 740, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 741, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 742, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 743, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 744, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 745, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 746, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 747, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 748, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 749, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 750, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 751, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 752, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 753, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 754, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 755, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 756, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 757, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 758, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 759, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 760, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 761, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 762, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 763, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 764, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 765, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 766, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 767, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 768, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 769, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 770, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 771, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 772, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 773, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 774, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 775, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 776, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 777, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 778, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 779, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 780, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 781, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 782, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 783, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 784, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 785, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 786, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 787, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 788, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 789, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 790, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 791, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 792, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 793, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 794, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 795, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 796, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 797, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 798, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 799, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 800, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 801, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 802, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 803, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 804, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 805, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 806, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 807, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 808, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 809, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 810, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 811, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [108, 0, 800] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t814", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t814", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t822", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t822", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t824", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t824", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t826", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t826", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 1, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }] + }, + "fShapes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoBBox", + "fUniqueID" : 1, + "fBits" : 50331648, + "fName" : "cave", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2000, + "fDY" : 2000, + "fDZ" : 2000, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "CoilTS", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1+CoilLongSideS:tran_CoilLongSide2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 4, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 67.5, + "fOrigin" : [0, 0, -189.6], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoTubeSeg", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilCornerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 25600, + "fDX" : 67.5, + "fDY" : 67.5, + "fDZ" : 25, + "fOrigin" : [67.5, 67.5, 0], + "fRmin" : 25, + "fRmax" : 135, + "fDz" : 25, + "fPhi1" : 0, + "fPhi2" : 90, + "fS1" : 0, + "fC1" : 1, + "fS2" : 1, + "fC2" : 6.12323399573677e-17, + "fSm" : 0.707106781186547, + "fCm" : 0.707106781186548, + "fCdfi" : 0.707106781186548 + }, + "fRight" : {"$ref":863}, + "fLeftMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner1", + "fTitle" : "", + "fTranslation" : [79.6, 0, -122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] + } + }, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner2", + "fTitle" : "", + "fTranslation" : [-79.6, 0, -122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 0, 0, 0, -1, 0, -1, 0] + } + } + } + }, + "fRight" : {"$ref":863}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner3", + "fTitle" : "", + "fTranslation" : [-79.6, 0, 122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 0, 0, 0, 1, 0, 1, 0] + } + } + } + }, + "fRight" : {"$ref":863}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner4", + "fTitle" : "", + "fTranslation" : [79.6, 0, 122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, -1, 0, 1, 0] + } + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilShortSideS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 79.6, + "fDY" : 25, + "fDZ" : 55, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilShortSide1", + "fTitle" : "", + "fTranslation" : [0, 0, -202.1] + } + } + }, + "fRight" : {"$ref":872}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilShortSide2", + "fTitle" : "", + "fTranslation" : [0, 0, 202.1] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilLongSideS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 55, + "fDY" : 25, + "fDZ" : 122.1, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilLongSide1", + "fTitle" : "", + "fTranslation" : [-159.6, 0, 0] + } + } + }, + "fRight" : {"$ref":875}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilLongSide2", + "fTitle" : "", + "fTranslation" : [159.6, 0, 0] + } + } + }, {"$ref":851}, {"$ref":853}, {"$ref":855}, {"$ref":857}, {"$ref":859}, {"$ref":861}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 9, + "fBits" : 50331648, + "fName" : "YokeS", + "fTitle" : "YokeContainerS-InnerSpaceInYokeS", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 130, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "YokeContainerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 130, + "fOrigin" : [0, 0, 0], + "fNvert" : 8, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [-303.81197846483, -350, -350, -303.81197846483, 303.81197846483, 350, 350, 303.81197846483], + "fY" : [-224, -144, 144, 224, 224, 144, -144, -224], + "fZ" : [-130, 130], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "InnerSpaceInYokeS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 230, + "fDY" : 115, + "fDZ" : 130.005, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : {"$ref":4} + } + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 10, + "fBits" : 50331648, + "fName" : "PoleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 84, + "fDY" : 124.5, + "fDZ" : 30.75, + "fOrigin" : [0, 0, 0], + "fNvert" : 8, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [-54, -84, -84, -54, 54, 84, 84, 54], + "fY" : [-124.5, -94.5, 94.5, 124.5, 124.5, 94.5, -94.5, -124.5], + "fZ" : [-30.75, 30.75], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 11, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.215, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 0.54921875, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.208, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 15, + "fBits" : 50331648, + "fName" : "TOF2ChamberS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 9.501, + "fDY" : 19.076, + "fDZ" : 0.841, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.215, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 0.9484375, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.208, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 20, + "fBits" : 50331648, + "fName" : "TOF2ChamberS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 29.501, + "fDY" : 16.676, + "fDZ" : 0.841, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "VETO", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 83.5, + "fDY" : 53.5, + "fDZ" : 52.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 22, + "fBits" : 50331648, + "fName" : "VMDL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.5, + "fDY" : 7.5, + "fDZ" : 52, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 23, + "fBits" : 50331648, + "fName" : "VFEL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 24, + "fBits" : 50331648, + "fName" : "VPBL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 25, + "fBits" : 50331648, + "fName" : "VSCL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 26, + "fBits" : 50331648, + "fName" : "VRFL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 27, + "fBits" : 50331648, + "fName" : "VRPL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 28, + "fBits" : 50331648, + "fName" : "VRSL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 29, + "fBits" : 50331648, + "fName" : "UMDL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.75, + "fDY" : 3.75, + "fDZ" : 52, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 30, + "fBits" : 50331648, + "fName" : "USCL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 31, + "fBits" : 50331648, + "fName" : "URSL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.1, + "fDY" : 3.65, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 32, + "fBits" : 50331648, + "fName" : "UPBL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 33, + "fBits" : 50331648, + "fName" : "UFEL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 34, + "fBits" : 50331648, + "fName" : "URFL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.1, + "fDY" : 3.65, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 35, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_6051", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "module_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoTube", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "holeS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 9216, + "fDX" : 5.75, + "fDY" : 5.75, + "fDZ" : 0.46, + "fOrigin" : [0, 0, 0], + "fRmin" : 0, + "fRmax" : 5.75, + "fDz" : 0.46 + }, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_6051", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 36, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_9663", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_9663", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 37, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_3220", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_3220", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 38, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_9357", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_9357", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 39, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 40, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 41, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 42, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station0_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":922}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "HE_GAS", + "fTitle" : "", + "fId" : 12, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "HE_GAS", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 13, + "fA" : 4, + "fZ" : 2, + "fDensity" : 1.78e-4, + "fRadLen" : 479968.980732484, + "fIntLen" : 312331.95325677, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 32, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":925}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":384} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":928}, + "fMother" : {"$ref":925}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":385} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station0_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":923}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "carbon", + "fTitle" : "", + "fId" : 18, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "carbon", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 17, + "fA" : 12.011, + "fZ" : 6, + "fDensity" : 2.265, + "fRadLen" : 18.7627684755763, + "fIntLen" : 35.4089682265511, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 33, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":925}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":386} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":933}, + "fMother" : {"$ref":925}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":387} + }] + }, + "fShape" : {"$ref":924}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 1, + "fBits" : 50331648, + "fName" : "air", + "fTitle" : "", + "fId" : 1, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 1, + "fBits" : 50462720, + "fName" : "air", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 0, + "fA" : 14.6873, + "fZ" : 7.32, + "fDensity" : 0.001205, + "fRadLen" : 30422.5122009781, + "fIntLen" : 70886.8082068035, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 3, + "fZmixture" : [7, 8, 18], + "fAmixture" : [14.01, 16, 39.95], + "fWeights" : [0.78, 0.21, 0.01], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 34, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 43, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":921}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 11, + "fBits" : 50331648, + "fName" : "IRON", + "fTitle" : "", + "fId" : 11, + "fParams" : [0, 1, 0.19, 1, -1, -1, 0.1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 9, + "fBits" : 50462720, + "fName" : "IRON", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 8, + "fA" : 55.85, + "fZ" : 26, + "fDensity" : 7.87, + "fRadLen" : 1.75771664360148, + "fIntLen" : 16.9675125483994, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 31, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":940}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":388} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":925}, + "fMother" : {"$ref":940}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":389} + }] + }, + "fShape" : {"$ref":939}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 35, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 44, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 45, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 46, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 47, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station1_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":948}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 37, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":951}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":390} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":954}, + "fMother" : {"$ref":951}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":391} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station1_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":949}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 38, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":951}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":392} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":957}, + "fMother" : {"$ref":951}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":393} + }] + }, + "fShape" : {"$ref":950}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 39, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 48, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":947}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "arco27030", + "fTitle" : "", + "fId" : 17, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "arco27030", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 16, + "fA" : 36.5434594614837, + "fZ" : 16.5659958077497, + "fDensity" : 0.0019, + "fRadLen" : 10960.19206385, + "fIntLen" : 59730.4440787846, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 3, + "fZmixture" : [18, 6, 8], + "fAmixture" : [39.948, 12.01, 15.9994], + "fWeights" : [0.864021297422359, 0.0371085832369314, 0.0988701193407093], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 36, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":960}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":394} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":951}, + "fMother" : {"$ref":960}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":395} + }] + }, + "fShape" : {"$ref":959}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 40, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 49, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 50, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 51, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 52, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station2_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":968}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 42, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":971}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":396} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":974}, + "fMother" : {"$ref":971}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":397} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station2_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":969}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 43, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":971}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":398} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":977}, + "fMother" : {"$ref":971}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":399} + }] + }, + "fShape" : {"$ref":970}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 44, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 53, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":967}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 41, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":980}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":400} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":971}, + "fMother" : {"$ref":980}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":401} + }] + }, + "fShape" : {"$ref":979}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 45, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 54, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.55, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 55, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 56, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 57, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 58, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station3_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":987}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 48, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":990}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":402} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":993}, + "fMother" : {"$ref":990}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":403} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station3_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":988}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 49, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":990}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":404} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":996}, + "fMother" : {"$ref":990}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":405} + }] + }, + "fShape" : {"$ref":989}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 50, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 59, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 60, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 61, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame1_station3_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":998}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 51, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1001}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":406} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1004}, + "fMother" : {"$ref":1001}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":407} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame1_station3_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":999}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 52, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1001}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":408} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1007}, + "fMother" : {"$ref":1001}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":409} + }] + }, + "fShape" : {"$ref":1000}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 53, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 62, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 69.2, + "fDY" : 24.35, + "fDZ" : 2.4, + "fOrigin" : [-3.5, 0.0999999999999996, 1.7], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":985}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 46, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":410} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":986}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 47, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":411} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":990}, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":412} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1001}, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":413} + }] + }, + "fShape" : {"$ref":1009}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 54, + "fNtotal" : 13, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 63, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 64, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 65, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 66, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1018}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 57, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":414} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1019}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 58, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":415} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1020}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 59, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":416} + }] + }, + "fShape" : {"$ref":1021}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 60, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 67, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 68, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 69, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 70, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1030}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 61, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":417} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1031}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 62, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":418} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1032}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 63, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":419} + }] + }, + "fShape" : {"$ref":1033}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 64, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 71, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":907}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 55, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":420} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":912}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 56, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":421} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1022}, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":423} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1034}, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":424} + }] + }, + "fShape" : {"$ref":1042}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 65, + "fNtotal" : 11, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 72, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 73, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 74, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 75, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1051}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 68, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":426} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1052}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 69, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":427} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1053}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 70, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":428} + }] + }, + "fShape" : {"$ref":1054}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 71, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 76, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 77, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 78, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 79, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1063}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 72, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":429} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1064}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 73, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":430} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1065}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 74, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":431} + }] + }, + "fShape" : {"$ref":1066}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 75, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 80, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":915}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 66, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":432} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":918}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 67, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":433} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1055}, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":435} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1067}, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":436} + }] + }, + "fShape" : {"$ref":1075}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 76, + "fNtotal" : 11, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 81, + "fBits" : 50331648, + "fName" : "StripGas", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.5, + "fDY" : 15, + "fDZ" : 0.150000005960464, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 82, + "fBits" : 50331648, + "fName" : "DetectorGlass", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 0.154499992728233, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 83, + "fBits" : 50331648, + "fName" : "DetectorPlate", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 0.159999996423721, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 84, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 1.5, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "tof1Detector", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1StripActiveGasV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1084}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "RPCgas", + "fTitle" : "", + "fId" : 6, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "RPCgas", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 5, + "fA" : 13.134094, + "fZ" : 6.433, + "fDensity" : 0.00375, + "fRadLen" : 10290.7323640963, + "fIntLen" : 17251.1264038771, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 4, + "fZmixture" : [6, 1, 9, 16], + "fAmixture" : [12.01, 1.008, 19, 32.06], + "fWeights" : [0.227, 0.248, 0.511, 0.014], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 78, + "fNtotal" : 1, + "fRefCount" : 48 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":438} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":439} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":440} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":441} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":442} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":443} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":444} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":445} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":446} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":447} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":448} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":449} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":450} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":451} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":452} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":453} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":454} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":455} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":456} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":457} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":458} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":459} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":460} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":461} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":462} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":463} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":464} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":465} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":466} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":467} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":468} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":469} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":470} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":471} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":472} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":473} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":474} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":475} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":476} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":477} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":478} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":479} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":480} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":481} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":482} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":483} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":484} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":485} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetGlassV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1DetGlassV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1085}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "RPCglass", + "fTitle" : "", + "fId" : 5, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "RPCglass", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 4, + "fA" : 21.6516575137294, + "fZ" : 10.8047928107838, + "fDensity" : 2.55, + "fRadLen" : 10.5807291507198, + "fIntLen" : 37.6225717576057, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [14, 8], + "fAmixture" : [28.09, 16], + "fWeights" : [0.467465468463971, 0.532534531536029], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 79, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":486} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetGlassV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1142}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":487} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetPlateV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1DetPlateV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1086}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "G10", + "fTitle" : "", + "fId" : 7, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "G10", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 6, + "fA" : 13.127344, + "fZ" : 6.696, + "fDensity" : 1.7, + "fRadLen" : 21.1963817958332, + "fIntLen" : 36.4724641224032, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 4, + "fZmixture" : [6, 1, 8, 14], + "fAmixture" : [12.01, 1.008, 16, 28.09], + "fWeights" : [0.259, 0.288, 0.248, 0.205], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 80, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":488} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetPlateV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1147}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":489} + }] + }, + "fShape" : {"$ref":1087}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 81, + "fNtotal" : 53, + "fRefCount" : 62 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 85, + "fBits" : 50331648, + "fName" : "OctagonActivePlaneS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 156.77368629035, + "fDY" : 156.77368629035, + "fDZ" : 0.05, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [12, 12], + "fRmax" : [144.84, 144.84], + "fZ" : [-0.05, 0.05], + "fNedges" : 8 + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 86, + "fBits" : 50331648, + "fName" : "OctagonS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 156.77368629035, + "fDY" : 156.77368629035, + "fDZ" : 13.25, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [12, 12], + "fRmax" : [144.84, 144.84], + "fZ" : [-13.25, 13.25], + "fNedges" : 8 + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 87, + "fBits" : 50331648, + "fName" : "MWPCContainerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 26.15396719429, + "fDY" : 26.15396719429, + "fDZ" : 3.5045, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [0, 0], + "fRmax" : [22.65, 22.65], + "fZ" : [-3.5045, 3.5045], + "fNedges" : 6 + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 88, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 12, + "fDY" : 21.65, + "fDZ" : 0.1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 89, + "fBits" : 50331648, + "fName" : "ecal01", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 48, + "fDY" : 60, + "fDZ" : 27.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 90, + "fBits" : 50331648, + "fName" : "ecal01mod", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 20, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 91, + "fBits" : 50331648, + "fName" : "ecal01front", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 92, + "fBits" : 50331648, + "fName" : "ecal01lay", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 93, + "fBits" : 50331648, + "fName" : "ecal01lead", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 94, + "fBits" : 50331648, + "fName" : "ecal01scint", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2, + "fDY" : 2, + "fDZ" : 0.075, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 95, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS0-upper_window_frameS0:upper_window_frame_pos0)-lower_window_rect_frameS0:lower_window_rect_frame_pos0", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 96, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS0-upper_window_frameS0:upper_window_frame_pos0", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos0", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos0", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1163}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 97, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS1-upper_window_frameS1:upper_window_frame_pos1)-lower_window_bevel_frameS1:lower_window_bevel_frame_pos1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 98, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS1-upper_window_frameS1:upper_window_frame_pos1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos1", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos1", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1172}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 99, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS2-upper_window_frameS2:upper_window_frame_pos2)-lower_window_bevel_frameS2:lower_window_bevel_frame_pos2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 100, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS2-upper_window_frameS2:upper_window_frame_pos2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos2", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos2", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1181}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 101, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS3-upper_window_frameS3:upper_window_frame_pos3)-lower_window_rect_frameS3:lower_window_rect_frame_pos3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 102, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS3-upper_window_frameS3:upper_window_frame_pos3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos3", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos3", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1190}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 103, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS4-upper_window_frameS4:upper_window_frame_pos4)-lower_window_rect_frameS4:lower_window_rect_frame_pos4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 104, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS4-upper_window_frameS4:upper_window_frame_pos4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos4", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos4", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1199}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 105, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS5-upper_window_frameS5:upper_window_frame_pos5)-lower_window_bevel_frameS5:lower_window_bevel_frame_pos5", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 106, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS5-upper_window_frameS5:upper_window_frame_pos5", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos5", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos5", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1208}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 107, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS6-upper_window_frameS6:upper_window_frame_pos6)-lower_window_bevel_frameS6:lower_window_bevel_frame_pos6", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 108, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS6-upper_window_frameS6:upper_window_frame_pos6", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos6", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos6", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1217}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 109, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS7-upper_window_frameS7:upper_window_frame_pos7)-lower_window_rect_frameS7:lower_window_rect_frame_pos7", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 110, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS7-upper_window_frameS7:upper_window_frame_pos7", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos7", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos7", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1226}, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }] + }, + "fVolumes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "cave", + "fTitle" : "Top volume", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Magnet_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "Magnet", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Coil_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "Coil", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":849}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "copper", + "fTitle" : "", + "fId" : 2, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "copper", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 1, + "fA" : 63.54, + "fZ" : 29, + "fDensity" : 8.96, + "fRadLen" : 1.43502863740006, + "fIntLen" : 15.5141335257514, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 3, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, -85, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Coil_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1264}, + "fMother" : {"$ref":1261}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, 85, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Pole_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "Pole", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":882}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "iron", + "fTitle" : "", + "fId" : 3, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "iron", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 2, + "fA" : 55.847, + "fZ" : 26, + "fDensity" : 7.87, + "fRadLen" : 1.75762222730907, + "fIntLen" : 16.9675125483994, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 4, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c3", + "fTitle" : "", + "fTranslation" : [0, -84.25, 0], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Pole_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1271}, + "fMother" : {"$ref":1261}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c3", + "fTitle" : "", + "fTranslation" : [0, 84.25, 0], + "fRotation" : {"$ref":1275} + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Yoke_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Yoke", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 6, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":878}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 4, + "fBits" : 50331648, + "fName" : "steel", + "fTitle" : "", + "fId" : 4, + "fParams" : [0, 1, 30, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 4, + "fBits" : 50462720, + "fName" : "steel", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 3, + "fA" : 55.3021846147983, + "fZ" : 25.7733568999496, + "fDensity" : 8.02, + "fRadLen" : 1.73601610180003, + "fIntLen" : 16.5874229502559, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 5, + "fZmixture" : [25, 14, 24, 28, 26], + "fAmixture" : [54.938, 28.09, 51.996, 58.693, 55.85], + "fWeights" : [0.0199389542374542, 0.00509743005324265, 0.179276379064425, 0.106508886477384, 0.689178350167495], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 5, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":4} + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fVolume" : {"$ref":1261}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 2, + "fNtotal" : 6, + "fRefCount" : 7 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, 0, 124.5] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof700_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "tof700", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF2ChamberV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "TOF2GlassVolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":883}, + "fMedium" : {"$ref":1143}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 7, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":7} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2ActiveGasVolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 1, + "fBits" : 58736640, + "fName" : "ActiveGasStrip", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":884}, + "fMedium" : {"$ref":1092}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 32 + }, + "fMother" : {"$ref":1293}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -17.02578125, + "fIndex" : 0, + "fFinder" : { + "_typename" : "TGeoPatternY", + "fUniqueID" : 0, + "fBits" : 50331648, + "fStep" : 1.0984375, + "fStart" : -17.575, + "fEnd" : 17.575, + "fNdivisions" : 32, + "fDivIndex" : 0, + "fVolume" : {"$ref":1293} + } + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -15.92734375, + "fIndex" : 1, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -14.82890625, + "fIndex" : 2, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -13.73046875, + "fIndex" : 3, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -12.63203125, + "fIndex" : 4, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -11.53359375, + "fIndex" : 5, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -10.43515625, + "fIndex" : 6, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -9.33671875, + "fIndex" : 7, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -8.23828125, + "fIndex" : 8, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -7.13984375, + "fIndex" : 9, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -6.04140625, + "fIndex" : 10, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -4.94296875, + "fIndex" : 11, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -3.84453125, + "fIndex" : 12, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -2.74609375, + "fIndex" : 13, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -1.64765625, + "fIndex" : 14, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -0.549218749999998, + "fIndex" : 15, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 0.549218750000001, + "fIndex" : 16, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 1.64765625, + "fIndex" : 17, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 2.74609375, + "fIndex" : 18, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 3.84453125, + "fIndex" : 19, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 4.94296875, + "fIndex" : 20, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 6.04140625, + "fIndex" : 21, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 7.13984375, + "fIndex" : 22, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 8.23828125, + "fIndex" : 23, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 9.33671875, + "fIndex" : 24, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 10.43515625, + "fIndex" : 25, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 11.53359375, + "fIndex" : 26, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 12.63203125, + "fIndex" : 27, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 13.73046875, + "fIndex" : 28, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 14.82890625, + "fIndex" : 29, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 15.92734375, + "fIndex" : 30, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 17.02578125, + "fIndex" : 31, + "fFinder" : {"$ref":1297} + }] + }, + "fShape" : {"$ref":885}, + "fMedium" : {"$ref":1092}, + "fFinder" : {"$ref":1297}, + "fVoxels" : null, + "fNumber" : 9, + "fNtotal" : 33, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "GasLayerPosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -0.128] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV0_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1291}, + "fMother" : {"$ref":1288}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":8} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2G10VolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":886}, + "fMedium" : {"$ref":1148}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 10, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":9} + }] + }, + "fShape" : {"$ref":887}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "aluminium", + "fTitle" : "", + "fId" : 8, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "aluminium", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 7, + "fA" : 26.98, + "fZ" : 13, + "fDensity" : 2.7, + "fRadLen" : 8.87510465963777, + "fIntLen" : 38.8622319406182, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 11, + "fNtotal" : 37, + "fRefCount" : 25 + }, + "fMother" : {"$ref":1285}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_1_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [86.1, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_2_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [71.9, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_3_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [55.8, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_4_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.1, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_5_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [25.7, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_6_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.3, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_7_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [-4.5, 27.15, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_8_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [88.2, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_9_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [72.1, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_10_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [58, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_11_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.3, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_12_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [27.8, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_13_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [27.8, -3.55, 647] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_14_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.5, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_15_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [86, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_16_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [71.9, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_17_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [55.8, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_18_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.1, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_19_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [25.7, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_20_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.3, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_21_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [-4.5, -34.15, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF2ChamberV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "TOF2GlassVolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":888}, + "fMedium" : {"$ref":1143}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 12, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":7} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2ActiveGasVolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 1, + "fBits" : 58736640, + "fName" : "ActiveGasStrip", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":890}, + "fMedium" : {"$ref":1092}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 16 + }, + "fMother" : {"$ref":1382}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -14.2265625, + "fIndex" : 0, + "fFinder" : { + "_typename" : "TGeoPatternY", + "fUniqueID" : 0, + "fBits" : 50331648, + "fStep" : 1.896875, + "fStart" : -15.175, + "fEnd" : 15.175, + "fNdivisions" : 16, + "fDivIndex" : 0, + "fVolume" : {"$ref":1382} + } + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -12.3296875, + "fIndex" : 1, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -10.4328125, + "fIndex" : 2, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -8.5359375, + "fIndex" : 3, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -6.6390625, + "fIndex" : 4, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -4.7421875, + "fIndex" : 5, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -2.8453125, + "fIndex" : 6, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -0.948437499999999, + "fIndex" : 7, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 0.948437500000001, + "fIndex" : 8, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 2.8453125, + "fIndex" : 9, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 4.7421875, + "fIndex" : 10, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 6.6390625, + "fIndex" : 11, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 8.5359375, + "fIndex" : 12, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 10.4328125, + "fIndex" : 13, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 12.3296875, + "fIndex" : 14, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 14.2265625, + "fIndex" : 15, + "fFinder" : {"$ref":1386} + }] + }, + "fShape" : {"$ref":889}, + "fMedium" : {"$ref":1092}, + "fFinder" : {"$ref":1386}, + "fVoxels" : null, + "fNumber" : 13, + "fNtotal" : 17, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":1329} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV1_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1380}, + "fMother" : {"$ref":1377}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":8} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2G10VolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":891}, + "fMedium" : {"$ref":1148}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 14, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":9} + }] + }, + "fShape" : {"$ref":892}, + "fMedium" : {"$ref":1333}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 15, + "fNtotal" : 21, + "fRefCount" : 7 + }, + "fMother" : {"$ref":1285}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_22_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.3, 25.15, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1377}, + "fMother" : {"$ref":1285}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_23_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.5, -4.25, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1377}, + "fMother" : {"$ref":1285}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_24_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.3, -31.95, 597.1] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 82.001, + "fDY" : 52.126, + "fDZ" : 25.791, + "fOrigin" : [68, -3.4, 622.05], + "fVolume" : {"$ref":1285}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 6, + "fNtotal" : 841, + "fRefCount" : 26 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":842} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VETO_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "VETO", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VMDL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VFEL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VFEL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRFL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRFL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":898}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 15, + "fBits" : 50331648, + "fName" : "PLASTIC", + "fTitle" : "", + "fId" : 15, + "fParams" : [0, 1, 0.19, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 15, + "fBits" : 50462720, + "fName" : "PLASTIC", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 14, + "fA" : 11.158100787, + "fZ" : 5.61284345, + "fDensity" : 1.032, + "fRadLen" : 42.0401716084694, + "fIntLen" : 70.7393809758668, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.01, 1.008], + "fWeights" : [0.9225687, 0.07743125], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 21, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1418}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":11} + }] + }, + "fShape" : {"$ref":895}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 18, + "fNtotal" : 2, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":13} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VFEL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1418}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":14} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VSCL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRSL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRSL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":900}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 23, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1426}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":18} + }] + }, + "fShape" : {"$ref":897}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "PLASTIC", + "fTitle" : "", + "fId" : 13, + "fParams" : [1, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":1423} + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 20, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":17} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VPBL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRPL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRPL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":899}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 22, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1432}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":20} + }] + }, + "fShape" : {"$ref":896}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "LEAD", + "fTitle" : "", + "fId" : 14, + "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 10, + "fBits" : 50462720, + "fName" : "LEAD", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 9, + "fA" : 207.19, + "fZ" : 82, + "fDensity" : 11.35, + "fRadLen" : 0.561704911574565, + "fIntLen" : 18.2591661751475, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 19, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":19} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":24} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":25} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":28} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":29} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":32} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":33} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":36} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":37} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":40} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":41} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":44} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":45} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":48} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":49} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":52} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":53} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":56} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":57} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":60} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":61} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":64} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":65} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":68} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":69} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":72} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":73} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":76} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":77} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":80} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":81} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":84} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":85} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":88} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":89} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":92} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":93} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":96} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":97} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":100} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":101} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":104} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":105} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":108} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":109} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":112} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":113} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":116} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":117} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":120} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":121} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":124} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":125} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":128} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":129} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":132} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":133} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":136} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":137} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":140} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":141} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":144} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":145} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":148} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":149} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":152} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":153} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":156} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":157} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":160} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":161} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":164} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":165} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":168} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":169} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":172} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":173} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":176} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":177} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":180} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":181} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":184} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":185} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":188} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":189} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":192} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":193} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":196} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":197} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":200} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":201} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":204} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":205} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":208} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":209} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":212} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":213} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":216} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":217} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":220} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":221} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":224} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":225} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":228} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":229} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":232} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":233} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":236} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":237} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":240} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":241} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":244} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":245} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":248} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":249} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":252} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":253} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":256} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":257} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":260} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":261} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":264} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":265} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":268} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":269} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":272} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":273} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":276} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":277} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":280} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":281} + }] + }, + "fShape" : {"$ref":894}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 17, + "fNtotal" : 269, + "fRefCount" : 202 + }, + "fMother" : {"$ref":1412}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":284} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":285} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":286} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":287} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":288} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":289} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":290} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":291} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":292} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":293} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":294} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":295} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":296} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":297} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":298} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":299} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":300} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":301} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":302} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":303} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":304} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":305} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":306} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":307} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":308} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":309} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "UMDL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UFEL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "UFEL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "URFL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "URFL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":906}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 29, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1597}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":12} + }] + }, + "fShape" : {"$ref":905}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 28, + "fNtotal" : 2, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":15} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UFEL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1597}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":16} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "USCL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "URSL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "URSL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":903}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 26, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1603}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":22} + }] + }, + "fShape" : {"$ref":902}, + "fMedium" : {"$ref":1430}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 25, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":21} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "UPBL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":904}, + "fMedium" : {"$ref":1436}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 27, + "fNtotal" : 1, + "fRefCount" : 66 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":23} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":26} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":27} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":30} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":31} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":34} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":35} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":38} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":39} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":42} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":43} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":46} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":47} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":50} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":51} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":54} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":55} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":58} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":59} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":62} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":63} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":66} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":67} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":70} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":71} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":74} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":75} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":78} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":79} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":82} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":83} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":86} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":87} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":90} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":91} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":94} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":95} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":98} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":99} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":102} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":103} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":106} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":107} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":110} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":111} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":114} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":115} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":118} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":119} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":122} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":123} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":126} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":127} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":130} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":131} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":134} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":135} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":138} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":139} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":142} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":143} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":146} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":147} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":150} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":151} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":154} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":155} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":158} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":159} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":162} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":163} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":166} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":167} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":170} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":171} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":174} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":175} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":178} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":179} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":182} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":183} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":186} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":187} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":190} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":191} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":194} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":195} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":198} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":199} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":202} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":203} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":206} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":207} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":210} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":211} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":214} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":215} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":218} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":219} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":222} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":223} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":226} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":227} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":230} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":231} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":234} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":235} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":238} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":239} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":242} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":243} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":246} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":247} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":250} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":251} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":254} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":255} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":258} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":259} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":262} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":263} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":266} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":267} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":270} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":271} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":274} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":275} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":278} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":279} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":282} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":283} + }] + }, + "fShape" : {"$ref":901}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 24, + "fNtotal" : 203, + "fRefCount" : 166 + }, + "fMother" : {"$ref":1412}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":310} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":311} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":312} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":313} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":314} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":315} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":316} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":317} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":318} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":319} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":320} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":321} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":322} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":323} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":324} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":325} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":326} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":327} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":328} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":329} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":330} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":331} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":332} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":333} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":334} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":335} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":336} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":337} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":338} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":339} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":340} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":341} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":342} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":343} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":344} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":345} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":346} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":347} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":348} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":349} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":350} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":351} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":352} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":353} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":354} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":355} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":356} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":357} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":358} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":359} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":360} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":361} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":362} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":363} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":364} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":365} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":366} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":367} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":368} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":369} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":370} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":371} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":372} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":373} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":374} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":375} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":376} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":377} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":378} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":379} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":380} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":381} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":382} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":383} + }] + }, + "fShape" : {"$ref":893}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 9, + "fBits" : 50331648, + "fName" : "AIR", + "fTitle" : "", + "fId" : 9, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 11, + "fBits" : 50462720, + "fName" : "AIR", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 10, + "fA" : 14.61, + "fZ" : 7.3, + "fDensity" : 0.001205, + "fRadLen" : 30412.608512906, + "fIntLen" : 70037.7174700344, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 16, + "fNtotal" : 24789, + "fRefCount" : 101 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":10} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "GEMS_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "GEMS", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":940}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 32.7], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":960}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 64.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":980}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 96.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1010}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, -4.5, 128.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1043}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [0, -6.9, 161.1], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1076}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [0, -6.9, 193.1], + "fRotation" : null + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.55, + "fDZ" : 81.75, + "fOrigin" : [0, -6.6, 113.75], + "fVolume" : {"$ref":1815}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 30, + "fNtotal" : 57, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":838} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF400_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF400", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 54, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 27, 454.8] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 0, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -27, 454.8] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -54, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 54, 446.46] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 27, 442.6] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 0, 446.46] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -27, 442.6] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -54, 446.46] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 69, + "fDZ" : 9.53, + "fOrigin" : [54.4, 0, 450.63], + "fVolume" : {"$ref":1831}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 77, + "fNtotal" : 531, + "fRefCount" : 12 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "tw", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCH_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "DCH", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHDetV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "DCHDetV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "DCHActivePlaneV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1151}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 83, + "fNtotal" : 1, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1859}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":490} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":491} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":492} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":493} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":494} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":495} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":496} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":497} + }] + }, + "fShape" : {"$ref":1152}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 84, + "fNtotal" : 9, + "fRefCount" : 10 + }, + "fMother" : {"$ref":1856}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c485", + "fTitle" : "", + "fTranslation" : [0, 0, 514], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "rot", + "fTitle" : "", + "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHDetV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1859}, + "fMother" : {"$ref":1856}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 713], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "rot", + "fTitle" : "", + "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] + } + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 204.834692374119, + "fDY" : 204.834692374119, + "fDZ" : 112.75, + "fOrigin" : [0, 0, 613.5], + "fVolume" : {"$ref":1856}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 82, + "fNtotal" : 19, + "fRefCount" : 4 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":843} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPC_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "MWPC", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCContainerV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "MWPCContainerV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "MWPCActivePlaneV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1154}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 86, + "fNtotal" : 1, + "fRefCount" : 6 + }, + "fMother" : {"$ref":1880}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":498} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":499} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":501} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":503} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":505} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":507} + }] + }, + "fShape" : {"$ref":1153}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 87, + "fNtotal" : 7, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1877}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "DetPos0_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -362.41265] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCContainerV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1880}, + "fMother" : {"$ref":1877}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "DetPos1_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -212.63755] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 26.15396719429, + "fDY" : 26.15396719429, + "fDZ" : 78.39205, + "fOrigin" : [0, 0, -287.5251], + "fVolume" : {"$ref":1877}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 85, + "fNtotal" : 15, + "fRefCount" : 4 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":844} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01mod", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01front_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "ecal01front", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 6, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1157}, + "fMedium" : {"$ref":1280}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 90, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1897}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":511} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01lay", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lead_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "ecal01lead", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1159}, + "fMedium" : {"$ref":1430}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 92, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1902}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":513} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "ecal01scint", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1160}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 20, + "fBits" : 50331648, + "fName" : "FscScint", + "fTitle" : "", + "fId" : 20, + "fParams" : [1, 1, 20, -1, -1, -1, 1e-4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 20, + "fBits" : 50462720, + "fName" : "FscScint", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 19, + "fA" : 11.0715201827875, + "fZ" : 5.57349581111957, + "fDensity" : 1.032, + "fRadLen" : 42.1299811568047, + "fIntLen" : 70.0999370078305, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.01, 1.008], + "fWeights" : [0.914699162223915, 0.0853008377760853], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 93, + "fNtotal" : 1, + "fRefCount" : 9 + }, + "fMother" : {"$ref":1902}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":514} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":515} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":516} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":517} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":518} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":519} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":520} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":521} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":522} + }] + }, + "fShape" : {"$ref":1158}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 91, + "fNtotal" : 11, + "fRefCount" : 230 + }, + "fMother" : {"$ref":1897}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":512} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":523} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":524} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":525} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":526} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":527} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":528} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":529} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":530} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":531} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":532} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":533} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":534} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":535} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":536} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":537} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":538} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":539} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":540} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":541} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":542} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":543} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":544} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":545} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":546} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":547} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":548} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":549} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":550} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":551} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":552} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":553} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":554} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":555} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":556} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":557} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":558} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":559} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":560} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":561} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":562} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":563} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":564} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":565} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":566} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":567} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":568} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":569} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":570} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":571} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":572} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":573} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":574} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":575} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":576} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":577} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":578} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":579} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":580} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":581} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":582} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":583} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":584} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":585} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":586} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":587} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":588} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":589} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_69", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 69, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":590} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_70", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 70, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":591} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_71", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 71, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":592} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_72", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 72, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":593} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_73", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 73, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":594} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_74", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 74, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":595} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_75", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 75, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":596} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_76", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 76, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":597} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_77", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 77, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":598} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_78", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 78, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":599} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_79", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 79, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":600} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_80", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 80, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":601} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_81", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 81, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":602} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_82", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 82, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":603} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_83", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 83, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":604} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_84", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 84, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":605} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_85", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 85, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":606} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_86", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 86, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":607} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_87", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 87, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":608} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_88", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 88, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":609} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_89", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 89, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":610} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_90", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 90, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":611} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_91", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 91, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":612} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_92", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 92, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":613} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_93", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 93, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":614} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_94", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 94, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":615} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_95", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 95, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":616} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_96", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 96, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":617} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_97", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 97, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":618} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_98", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 98, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":619} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_99", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 99, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":620} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_100", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 100, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":621} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_101", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 101, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":622} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_102", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 102, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":623} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_103", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 103, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":624} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_104", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 104, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":625} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_105", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 105, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":626} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_106", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 106, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":627} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_107", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 107, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":628} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_108", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 108, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":629} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_109", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 109, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":630} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_110", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 110, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":631} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_111", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 111, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":632} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_112", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 112, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":633} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_113", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 113, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":634} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_114", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 114, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":635} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_115", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 115, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":636} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_116", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 116, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":637} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_117", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 117, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":638} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_118", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 118, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":639} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_119", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 119, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":640} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_120", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 120, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":641} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_121", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 121, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":642} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_122", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 122, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":643} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_123", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 123, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":644} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_124", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 124, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":645} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_125", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 125, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":646} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_126", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 126, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":647} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_127", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 127, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":648} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_128", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 128, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":649} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_129", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 129, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":650} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_130", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 130, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":651} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_131", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 131, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":652} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_132", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 132, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":653} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_133", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 133, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":654} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_134", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 134, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":655} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_135", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 135, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":656} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_136", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 136, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":657} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_137", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 137, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":658} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_138", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 138, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":659} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_139", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 139, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":660} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_140", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 140, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":661} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_141", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 141, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":662} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_142", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 142, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":663} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_143", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 143, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":664} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_144", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 144, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":665} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_145", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 145, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":666} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_146", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 146, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":667} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_147", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 147, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":668} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_148", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 148, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":669} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_149", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 149, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":670} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_150", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 150, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":671} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_151", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 151, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":672} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_152", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 152, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":673} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_153", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 153, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":674} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_154", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 154, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":675} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_155", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 155, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":676} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_156", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 156, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":677} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_157", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 157, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":678} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_158", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 158, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":679} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_159", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 159, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":680} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_160", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 160, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":681} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_161", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 161, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":682} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_162", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 162, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":683} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_163", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 163, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":684} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_164", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 164, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":685} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_165", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 165, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":686} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_166", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 166, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":687} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_167", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 167, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":688} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_168", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 168, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":689} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_169", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 169, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":690} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_170", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 170, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":691} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_171", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 171, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":692} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_172", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 172, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":693} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_173", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 173, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":694} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_174", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 174, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":695} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_175", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 175, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":696} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_176", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 176, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":697} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_177", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 177, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":698} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_178", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 178, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":699} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_179", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 179, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":700} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_180", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 180, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":701} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_181", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 181, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":702} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_182", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 182, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":703} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_183", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 183, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":704} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_184", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 184, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":705} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_185", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 185, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":706} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_186", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 186, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":707} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_187", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 187, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":708} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_188", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 188, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":709} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_189", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 189, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":710} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_190", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 190, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":711} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_191", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 191, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":712} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_192", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 192, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":713} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_193", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 193, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":714} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_194", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 194, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":715} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_195", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 195, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":716} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_196", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 196, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":717} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_197", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 197, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":718} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_198", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 198, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":719} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_199", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 199, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":720} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_200", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 200, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":721} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_201", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 201, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":722} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_202", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 202, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":723} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_203", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 203, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":724} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_204", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 204, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":725} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_205", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 205, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":726} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_206", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 206, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":727} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_207", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 207, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":728} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_208", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 208, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":729} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_209", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 209, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":730} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_210", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 210, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":731} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_211", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 211, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":732} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_212", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 212, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":733} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_213", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 213, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":734} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_214", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 214, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":735} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_215", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 215, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":736} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_216", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 216, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":737} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_217", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 217, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":738} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_218", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 218, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":739} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_219", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 219, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":740} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_220", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 220, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":741} + }] + }, + "fShape" : {"$ref":1156}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 89, + "fNtotal" : 2422, + "fRefCount" : 301 + }, + "fMother" : {"$ref":1894}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":510} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":742} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":743} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":744} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":745} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":746} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":747} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":748} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":749} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":750} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":751} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":752} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":753} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":754} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":755} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":756} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":757} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":758} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":759} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":760} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":761} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":762} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":763} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":764} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":765} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":766} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":767} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":768} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":769} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":770} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":771} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":772} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":773} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":774} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":775} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":776} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":777} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":778} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":779} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":780} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":781} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":782} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":783} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":784} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":785} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":786} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":787} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":788} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":789} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":790} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":791} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":792} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":793} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":794} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":795} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":796} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":797} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":798} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":799} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":800} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":801} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":802} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":803} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":804} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":805} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":806} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":807} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":808} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_69", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 69, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":809} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_70", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 70, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":810} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_71", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 71, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":811} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_72", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 72, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":812} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_73", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 73, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":813} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_74", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 74, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":814} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_75", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 75, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":815} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_76", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 76, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":816} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_77", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 77, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":817} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_78", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 78, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":818} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_79", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 79, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":819} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_80", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 80, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":820} + }] + }, + "fShape" : {"$ref":1155}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 88, + "fNtotal" : 193761, + "fRefCount" : 82 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":509} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1894}, + "fMother" : {"$ref":1258}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":821} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Silicon_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "Silicon", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1233}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "silicon", + "fTitle" : "", + "fId" : 21, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "silicon", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 20, + "fA" : 28.0855, + "fZ" : 14, + "fDensity" : 2.33, + "fRadLen" : 9.34960746942193, + "fIntLen" : 45.753205754866, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2224}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":822} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1234}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2224}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":823} + }] + }, + "fShape" : {"$ref":1235}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 97, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c812", + "fTitle" : "", + "fTranslation" : [9, 6.15175, 3.325], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1161}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 98, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c814", + "fTitle" : "", + "fTranslation" : [9, 6.15175, 3.22], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1238}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2239}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":824} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1236}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2239}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":825} + }] + }, + "fShape" : {"$ref":1237}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 100, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c814", + "fTitle" : "", + "fTranslation" : [3, 6.15175, 1.795], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1170}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c816", + "fTitle" : "", + "fTranslation" : [3, 6.15175, 1.69], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_2_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1240}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2252}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":826} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1241}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2252}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":827} + }] + }, + "fShape" : {"$ref":1239}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 101, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [-3, 6.15175, 3.105], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1179}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [-3, 6.15175, 3.21], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_3_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1243}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2263}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":828} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1244}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2263}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":829} + }] + }, + "fShape" : {"$ref":1242}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 102, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [-9, 6.15175, 1.575], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1188}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [-9, 6.15175, 1.68], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_4_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1246}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2274}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":830} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1247}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2274}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":831} + }] + }, + "fShape" : {"$ref":1245}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 103, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c820", + "fTitle" : "", + "fTranslation" : [9, -6.15175, 2.065], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1197}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c822", + "fTitle" : "", + "fTranslation" : [9, -6.15175, 2.17], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_5_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1249}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2287}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":832} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1250}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2287}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":833} + }] + }, + "fShape" : {"$ref":1248}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 104, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c822", + "fTitle" : "", + "fTranslation" : [3, -6.15175, 3.595], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1206}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c824", + "fTitle" : "", + "fTranslation" : [3, -6.15175, 3.7], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_6_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1252}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2300}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":834} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1253}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2300}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":835} + }] + }, + "fShape" : {"$ref":1251}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 105, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c824", + "fTitle" : "", + "fTranslation" : [-3, -6.15175, 2.285], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1215}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c826", + "fTitle" : "", + "fTranslation" : [-3, -6.15175, 2.18], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_7_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1255}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2313}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":836} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1256}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2313}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":837} + }] + }, + "fShape" : {"$ref":1254}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 106, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c826", + "fTitle" : "", + "fTranslation" : [-9, -6.15175, 3.815], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1224}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c828", + "fTitle" : "", + "fTranslation" : [-9, -6.15175, 3.71], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 12.15, + "fDY" : 12.4535, + "fDZ" : 1.135, + "fOrigin" : [0, 0, 2.695], + "fVolume" : {"$ref":2221}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 3, + "fNtotal" : 33, + "fRefCount" : 17 + }, + "fMother" : {"$ref":2218}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, -4.5, 0] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 12.15, + "fDY" : 12.4535, + "fDZ" : 1.135, + "fOrigin" : [0, -4.5, 2.695], + "fVolume" : {"$ref":2218}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 94, + "fNtotal" : 34, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":839} + }] + }, + "fShape" : {"$ref":848}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 1, + "fNtotal" : 413815, + "fRefCount" : 10 + }, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1385}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2242}, {"$ref":2252}, {"$ref":2255}, {"$ref":2257}, {"$ref":2263}, {"$ref":2266}, {"$ref":2268}, {"$ref":2274}, {"$ref":2277}, {"$ref":2279}, {"$ref":2287}, {"$ref":2290}, {"$ref":2292}, {"$ref":2300}, {"$ref":2303}, {"$ref":2305}, {"$ref":2313}, {"$ref":2316}, {"$ref":2318}] + }, + "fPhysicalNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fTracks" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fPdgNames" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "d", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "d_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "u", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "u_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "s", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "s_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b'_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t'_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "e-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "e+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_e", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_e_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "mu-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "mu+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_mu", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_mu_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_tau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_tau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau'-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau'+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu'_tau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu'_tau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "g", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "gamma", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "h0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "reggeon", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pomeron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z'0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z\"0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W'+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W'-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "A0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "LQ_ue", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "LQ_ue_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "R0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "R0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi'_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega_tech", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_L++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_L--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_R++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_R--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W_R+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W_R-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Re", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Re_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rmu", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rmu_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rtau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rtau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "specflav", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rndmflav", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rndmflav_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phasespa", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c-hadron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c-hadron_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b-hadron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b-hadron_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cluster", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "string", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "indep.", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CMshower", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "SPHEaxis", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "THRUaxis", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CLUSjet", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CELLjet", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "table", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_diff0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K_L0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_diffr+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_diffr-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega_di", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "f_2", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K_S0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phi_diff", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phi", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "f'_2", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D_s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D_s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "J\/psi_di", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "J\/psi", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "chi_2c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Upsilon", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "chi_2b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "dd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "dd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "n_diffr0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "n_diffr0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "neutron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "antineutron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "uu_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "uu_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "p_diffr+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "p_diffr+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "proton", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "antiproton", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ss_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ss_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Omega-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Omega+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c-", + "fTitle" : "" + }] + }, + "fMaterials" : { + "_typename" : "TList", + "name" : "THashList", + "arr" : [{"$ref":938}, {"$ref":1266}, {"$ref":1273}, {"$ref":1281}, {"$ref":1144}, {"$ref":1093}, {"$ref":1149}, {"$ref":1334}, {"$ref":945}, {"$ref":1437}, {"$ref":1813}, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "VACUUM", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 11, + "fA" : 0, + "fZ" : 0, + "fDensity" : 0, + "fRadLen" : 1e30, + "fIntLen" : 1e30, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "SILICON", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 12, + "fA" : 28.09, + "fZ" : 14, + "fDensity" : 2.33, + "fRadLen" : 9.35110551053256, + "fIntLen" : 45.753205754866, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, {"$ref":930}, {"$ref":1423}, { + "_typename" : "TGeoMixture", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TYVEC", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 15, + "fA" : 10.4296180316, + "fZ" : 5.281386, + "fDensity" : 0.93, + "fRadLen" : 47.5076063184073, + "fIntLen" : 72.8965033104632, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.011, 1.008], + "fWeights" : [0.8562772, 0.1437228], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + }, {"$ref":965}, {"$ref":935}, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "lead", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 18, + "fA" : 207.1, + "fZ" : 82, + "fDensity" : 11.34, + "fRadLen" : 0.561956031451292, + "fIntLen" : 18.2752677326212, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, {"$ref":1909}, {"$ref":2229}], + "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + "fMedia" : { + "_typename" : "TList", + "name" : "THashList", + "arr" : [{"$ref":937}, {"$ref":1265}, {"$ref":1272}, {"$ref":1280}, {"$ref":1143}, {"$ref":1092}, {"$ref":1148}, {"$ref":1333}, {"$ref":1812}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 10, + "fBits" : 50331648, + "fName" : "VACUUM", + "fTitle" : "", + "fId" : 10, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2589} + }, {"$ref":944}, {"$ref":929}, {"$ref":1430}, {"$ref":1436}, {"$ref":1422}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TYVEC", + "fTitle" : "", + "fId" : 16, + "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2591} + }, {"$ref":964}, {"$ref":934}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "lead", + "fTitle" : "", + "fId" : 19, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2592} + }, {"$ref":1908}, {"$ref":2228}], + "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cave_1", + "fTitle" : "Top logical node", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1258}, + "fMother" : null, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":2} + }] + }, + "fOverlaps" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fRegions" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fMasterVolume" : {"$ref":1258}, + "fGLMatrix" : { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, + "fUniqueVolumes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{"$ref":1258}, {"$ref":1258}, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2252}, {"$ref":2263}, {"$ref":2274}, {"$ref":2287}, {"$ref":2300}, {"$ref":2313}] + }, + "fNLevel" : 100, + "fHashPNE" : { + "_typename" : "THashList", + "name" : "THashList", + "arr" : [], + "opt" : [] + }, + "fSizePNEId" : 0, + "fNPNEId" : 0, + "fKeyPNEId" : [], + "fValuePNEId" : [], + "fUsePWNav" : false, + "fParallelWorld" : null +} \ No newline at end of file -- 2.34.1 From f2120aedf32629eaf67eaa4674f71299f1a4eb79 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 19 Aug 2021 10:02:26 +0300 Subject: [PATCH 008/143] WIP Root object model --- .../src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 26517477..557783ae 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -20,6 +20,9 @@ public class TGeoManager : TNamed() { * Load Json encoded TGeoManager */ public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + + public fun decodeFromString(string: String): TGeoManager = + RootJsonSerialFormat().decodeFromString(serializer(), string) } } -- 2.34.1 From f6a78c5a31df74189ac803efd1aafe83b9394fc2 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 20 Aug 2021 15:43:12 +0300 Subject: [PATCH 009/143] Documentation --- README.md | 12 +++ docs/hierarchy.md | 19 ++-- docs/{inheritance => inheritance.md} | 0 docs/uml/Vision.puml | 98 ++++++++++++------- .../space/kscience/visionforge/Vision.kt | 2 +- .../kscience/visionforge/solid/SolidGroup.kt | 2 +- 6 files changed, 87 insertions(+), 46 deletions(-) rename docs/{inheritance => inheritance.md} (100%) diff --git a/README.md b/README.md index 621f474f..b8ff5212 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ * [visionforge-core](#visionforge-core) * [visionforge-solid](#visionforge-solid) * [visionforge-gdml](#visionforge-gdml) + * [visionforge-fx](#visionforge-fx) + * [visionforge-markdown](#visionforge-markdown) + * [visionforge-plotly](#visionforge-plotly) + * [visionforge-server](#visionforge-server) + * [visionforge-threejs](#visionforge-threejs) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) * [Simple Example - Solid Showcase](#simple-example---solid-showcase) @@ -65,6 +70,13 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository ### visionforge-core +> Core classes, algebra definitions, basic linear algebra +> +> **Maturity**: DEVELOPMENT +> +> **Features:** +> - [vision](visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt) : an architecture of visions. +
Contains a general hierarchy of classes and interfaces useful for visualization. This module is not specific to 3D-visualization. diff --git a/docs/hierarchy.md b/docs/hierarchy.md index dbb2c6c1..c3d9d287 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -3,14 +3,19 @@ ![](../docs/images/hierarchy.png) ### Vision +* function `getPropertyValue(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. -* function `getProperty(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean)`. +* function `setProperty(name: Name, item: Any?)` - a convenient method to set property node or value. If `item` is null, then node is removed, not a value +Sets the `item` property to the element with the `name` identification. -It gets properties of element with `name` identification. -`inherit` — toggles parent node property lookup. Null means inference from descriptor. Default is false. -`includeStyles` — toggles inclusion of. Null means inference from descriptor. Default is true. -`includeDefaults` — default is false. +### SolidGroup -* function `setProperty(name: Name, item: MetaItem?, notify: Boolean = true)` +* function `getPrototype(name: Name)` - get a prototype redirecting the request to the parent if prototype is not found. If prototype is a ref, then it is unfolded automatically. -Sets the `item` property to the element with the `name` identification. `notify` is a value which toggles the necessity of the change notification. Default is true. +* function `prototypes(builder: VisionContainerBuilder.() -> Unit)` - create or edit prototype node as a group. + +### RootVisionGroup + +Non-serializable root group used to propagate manager to its children. + +* function Vision.root(manager: VisionManager) - designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent. diff --git a/docs/inheritance b/docs/inheritance.md similarity index 100% rename from docs/inheritance rename to docs/inheritance.md diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 609a3723..b7929c80 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -3,41 +3,50 @@ interface Vision{ val parent: VisionGroup? - fun getProperty(name):TypedMetaItem? - fun setProperty(name, item) + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? } interface Solid{ - base of 3D geometries + val descriptor: MetaDescriptor + val parent: VisionGroup? } -Vision <- Solid +Vision <-- Solid class VisionGroup{ - a group of visions + val children: Map + val defaultTarget: String + fun content(target): Map + fun get(name: Name): Vision? } - Vision <-- VisionGroup class VisionBase{ - basic vision - implementation + var parent: VisionGroup? + var properties: MutableMeta? + fun getOrCreateProperties(): MutableMeta } -Vision <- VisionBase +Vision <-- VisionBase class SolidLabel Solid <--- SolidLabel -class SolidGroup -Solid <--- SolidGroup -MutableVisionGroup <-- SolidGroup +class SolidGroup{ + var properties: MutableMeta? + val children: Map + var prototypes: MutableVisionGroup? + fun getPrototype(name): Solid? + fun prototypes(builder) +} +Solid <--- SolidGroup +VisionGroupBase <-- SolidGroup class SphereLayer -GeometrySolid <-- SphereLayer +Solid <-- SphereLayer class Sphere -GeometrySolid <-- Sphere +Solid <-- Sphere class Box Hexagon <-- Box @@ -46,24 +55,21 @@ class GenericHexagon Hexagon <-- GenericHexagon class Extruded -GeometrySolid <-- Extruded +Solid <-- Extruded class PolyLine Solid <--- PolyLine -interface GeometrySolid -Solid <--- GeometrySolid - interface Hexagon -GeometrySolid <-- Hexagon +Solid <-- Hexagon class ConeSegment -GeometrySolid <-- ConeSegment +Solid <-- ConeSegment class ConeSurface -GeometrySolid <-- ConeSurface +Solid <-- ConeSurface class Convex @@ -73,29 +79,47 @@ class Composite Solid <--- Composite -interface SolidReference +interface SolidReference{ + val prototype: Solid + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} VisionGroup <---- SolidReference -interface MutableVisionGroup +class SolidReferenceGroup{ + val refName: Name + var properties: MutableMeta? + val prototype: Solid + val children: Map + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} +VisionBase <-- SolidReferenceGroup + +interface MutableVisionGroup{ + fun onStructureChanged(owner, block) + fun removeStructureListener(owner) +} VisionGroup <---- MutableVisionGroup -class SolidReferenceGroup -VisionGroup <-- SolidReferenceGroup -Solid <-- SolidReferenceGroup -VisionBase <-- SolidReferenceGroup -SolidReference <-- SolidReferenceGroup - -class ReferenceChild -VisionGroup <-- ReferenceChild -Solid <-- ReferenceChild -SolidReference <-- ReferenceChild - - +class VisionGroupBase{ + val children: Map + fun set(name: Name?, child: Vision?) +} +VisionBase <-- VisionGroupBase +MutableVisionGroup <-- VisionGroupBase class RootVisionGroup -MutableVisionGroup <-- RootVisionGroup +VisionGroupBase <-- RootVisionGroup -class VisionOfPlotly +class VisionOfPlotly{ + var properties: MutableMeta? + val plot: Plot +} VisionBase <-- VisionOfPlotly + +class VisionOfMarkup{ + val format: String + var content: String? +} +VisionBase <-- VisionOfMarkup @enduml \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 924dfdd1..54e9261c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -109,7 +109,7 @@ public fun Vision.getPropertyValue( ): Value? = getPropertyValue(Name.parse(key), inherit, includeStyles, includeDefaults) /** - * A convenience method to set property node or value. If Item is null, then node is removed, not a value + * A convenient method to set property node or value. If Item is null, then node is removed, not a value */ public fun Vision.setProperty(name: Name, item: Any?) { when (item) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index ec6dd5f1..3f49df5e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -26,7 +26,7 @@ public interface PrototypeHolder { /** * Represents 3-dimensional Visual Group - * @param prototypes A container for templates visible inside this group + * @param prototypes is a container for templates visible inside this group */ @Serializable @SerialName("group.solid") -- 2.34.1 From fcf5ab17ca8c9bbc0949582e7af7127232544e9b Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 20 Aug 2021 15:52:32 +0300 Subject: [PATCH 010/143] Documentation vol.2 --- build.gradle.kts | 4 ++++ docs/uml/Vision.puml | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2dc7926a..5d7a7ec8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,4 +33,8 @@ ksciencePublish { apiValidation { validationDisabled = true ignoredPackages.add("info.laht.threekt") +} + +rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { + rootProject.the().versions.webpackDevServer.version = "4.0.0-rc.0" } \ No newline at end of file diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index b7929c80..2b4d9953 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -7,23 +7,23 @@ interface Vision{ } interface Solid{ - val descriptor: MetaDescriptor - val parent: VisionGroup? + The base for 3D geometry } Vision <-- Solid class VisionGroup{ + A group of Visions + val children: Map val defaultTarget: String + fun content(target): Map fun get(name: Name): Vision? } Vision <-- VisionGroup class VisionBase{ - var parent: VisionGroup? - var properties: MutableMeta? - fun getOrCreateProperties(): MutableMeta + basic vision implementation } Vision <-- VisionBase @@ -110,7 +110,6 @@ MutableVisionGroup <-- VisionGroupBase class RootVisionGroup VisionGroupBase <-- RootVisionGroup - class VisionOfPlotly{ var properties: MutableMeta? val plot: Plot -- 2.34.1 From 8babcd7f88af7639e30a700e7fb6196a1e39b773 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 20 Aug 2021 16:12:04 +0300 Subject: [PATCH 011/143] Documentation vol.3 --- docs/hierarchy.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/hierarchy.md b/docs/hierarchy.md index c3d9d287..a534c5f1 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -6,7 +6,25 @@ * function `getPropertyValue(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. * function `setProperty(name: Name, item: Any?)` - a convenient method to set property node or value. If `item` is null, then node is removed, not a value -Sets the `item` property to the element with the `name` identification. +Sets the `item` property to the element with the `name` identification. + +### VisionBase + +Basic vision implementation + +### VisionGroup + +A group of Visions. + +### MutableVisionGroup + +Mutable version of VisionGroup. + +low structure changes of this group. Unconsumed changes are discarded. + +### Solid + +Interface for 3-dimensional Vision. ### SolidGroup @@ -14,6 +32,10 @@ Sets the `item` property to the element with the `name` identification. * function `prototypes(builder: VisionContainerBuilder.() -> Unit)` - create or edit prototype node as a group. +### SolidReferenceGroup + +A reference Solid to reuse a template object. + ### RootVisionGroup Non-serializable root group used to propagate manager to its children. -- 2.34.1 From 1c36940d1943f49f36fc1c914609cb45516fce0c Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Fri, 20 Aug 2021 16:32:01 +0300 Subject: [PATCH 012/143] Update build.gradle.kts --- build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 44f0d885..56d25b93 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,4 +36,6 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -//workaround for https://youtrack.jetbrains.com/issue/KT-48273 +rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { + rootProject.the().versions.webpackDevServer.version = "4.0.0-rc.0" +} -- 2.34.1 From 369844b75044e19f7c575e20b6cdc3aed5245cd0 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 20 Aug 2021 16:52:40 +0300 Subject: [PATCH 013/143] changes in README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index b8ff5212..91672970 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,6 @@ * [visionforge-core](#visionforge-core) * [visionforge-solid](#visionforge-solid) * [visionforge-gdml](#visionforge-gdml) - * [visionforge-fx](#visionforge-fx) - * [visionforge-markdown](#visionforge-markdown) - * [visionforge-plotly](#visionforge-plotly) - * [visionforge-server](#visionforge-server) - * [visionforge-threejs](#visionforge-threejs) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) * [Simple Example - Solid Showcase](#simple-example---solid-showcase) -- 2.34.1 From a748282d63fe547830260697d6c4017ecd399d79 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:24:41 +0300 Subject: [PATCH 014/143] Fix Jupyter Kapt problem --- demo/jupyter-playground/build.gradle.kts | 4 ++-- .../VisionForgePlayGroundForJupyter.kt | 4 ++-- demo/playground/build.gradle.kts | 18 +++++++++--------- gradle.properties | 2 ++ 4 files changed, 15 insertions(+), 13 deletions(-) rename demo/jupyter-playground/src/main/kotlin/{hep/dataforge/playground => }/VisionForgePlayGroundForJupyter.kt (96%) diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts index 903b991b..62f92348 100644 --- a/demo/jupyter-playground/build.gradle.kts +++ b/demo/jupyter-playground/build.gradle.kts @@ -5,6 +5,7 @@ plugins { } repositories { + jcenter() mavenCentral() maven("https://repo.kotlin.link") } @@ -15,7 +16,6 @@ dependencies { tasks.withType { kotlinOptions { - useIR = true jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() } } @@ -29,7 +29,7 @@ tasks.withType { } tasks.processJupyterApiResources { - libraryProducers = listOf("space.kscience.dataforge.playground.VisionForgePlayGroundForJupyter") + libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") } tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 96% rename from demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt rename to demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 88e4effb..12426672 100644 --- a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,4 +1,4 @@ -package space.kscience.dataforge.playground +package playground import kotlinx.html.div import kotlinx.html.id @@ -24,7 +24,7 @@ import space.kscience.visionforge.visionManager @JupyterLibrary @DFExperimental -internal class VisionForgePlayGroundForJupyter : JupyterIntegration() { +public class VisionForgePlayGroundForJupyter : JupyterIntegration() { private val context = Context("VisionForge") { plugin(Solids) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index a89fe123..515cb165 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,25 +51,25 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation(project(":visionforge-solid")) - implementation(project(":visionforge-gdml")) - implementation(project(":visionforge-plotly")) - implementation(projects.visionforge.visionforgeMarkdown) + api(project(":visionforge-solid")) + api(project(":visionforge-gdml")) + api(project(":visionforge-plotly")) + api(projects.visionforge.visionforgeMarkdown) } } val jsMain by getting{ dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) + api(project(":ui:ring")) + api(project(":visionforge-threejs")) } } val jvmMain by getting{ dependencies { - implementation(project(":visionforge-server")) - implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + api(project(":visionforge-server")) + api("ch.qos.logback:logback-classic:1.2.3") + api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..511d4130 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kotlin.jupyter.add.scanner=false + org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file -- 2.34.1 From 5d2c853cbec6138bb53fc5580ada6eb76ca50e4b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:25:19 +0300 Subject: [PATCH 015/143] WIP ROOT json serialization --- build.gradle.kts | 7 +- .../kotlin/ru/mipt/npm/root/RootModel.kt | 25 ------ .../kotlin/ru/mipt/npm/root/TGeoHMatrix.kt | 7 ++ .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 88 +++++++++++++++++-- .../kotlin/ru/mipt/npm/root/TGeoMaterial.kt | 3 + .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 2 + .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 34 ++++++- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 3 + .../kotlin/ru/mipt/npm/root/TObject.kt | 2 + .../kotlin/ru/mipt/npm/root/loadBM@N.kt | 7 ++ 11 files changed, 144 insertions(+), 42 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt create mode 100644 cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt diff --git a/build.gradle.kts b/build.gradle.kts index 505c349c..cd6ece5d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,8 +37,7 @@ apiValidation { } -afterEvaluate { - extensions.configure { - versions.webpackDevServer.version = "4.0.0" - } +//workaround for https://youtrack.jetbrains.com/issue/KT-48273 +rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { + rootProject.the().versions.webpackDevServer.version = "4.0.0" } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt deleted file mode 100644 index 8f53d71f..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt +++ /dev/null @@ -1,25 +0,0 @@ -package ru.mipt.npm.root - -import kotlin.properties.PropertyDelegateProvider -import kotlin.reflect.KType -import kotlin.reflect.typeOf - -public interface RootValueProvider { - /** - * Provide a member cast or reinterpreted to given type. - * Returns null if member with given name/type could not be resolved. - */ - public fun provideOrNull(name: String, type: KType): T? -} - -public interface RootModel { - public val provider: RootValueProvider -} - -public inline fun RootValueProvider.provide(name: String): T = - provideOrNull(name, typeOf()) ?: error("A member with type ${T::class} and name $name could not be resolved") - -public inline fun RootModel.member(name: String? = null): PropertyDelegateProvider> = - PropertyDelegateProvider { _, property -> - lazy { provider.provide(name ?: property.name) } - } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt index f70e9a24..3e1362f8 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt @@ -1,15 +1,19 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMatrix") public sealed class TGeoMatrix : TNamed() @Serializable +@SerialName("TGeoIdentity") public class TGeoIdentity : TGeoMatrix() @Serializable +@SerialName("TGeoHMatrix") public class TGeoHMatrix( public val fTranslation: DoubleArray, public val fRotationMatrix: DoubleArray, @@ -17,16 +21,19 @@ public class TGeoHMatrix( ) : TGeoMatrix() @Serializable +@SerialName("TGeoTranslation") public class TGeoTranslation( public val fTranslation: DoubleArray ) : TGeoMatrix() @Serializable +@SerialName("TGeoRotation") public class TGeoRotation( public val fRotationMatrix: DoubleArray ): TGeoMatrix() @Serializable +@SerialName("TGeoCombiTrans") public class TGeoCombiTrans( public val fTranslation: DoubleArray, public val fRotation: TGeoRotation? = null, diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 557783ae..acf4d712 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,11 +1,18 @@ package ru.mipt.npm.root import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonObject import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass @Serializable +@SerialName("TGeoManager") public class TGeoManager : TNamed() { public val fMatrices: TObjArray = TObjArray.empty @@ -20,19 +27,31 @@ public class TGeoManager : TNamed() { * Load Json encoded TGeoManager */ public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() - + public fun decodeFromString(string: String): TGeoManager = - RootJsonSerialFormat().decodeFromString(serializer(), string) + Root().decodeFromString(serializer(), string) } } @OptIn(ExperimentalSerializationApi::class) -private class RootJsonSerialFormat : StringFormat { - - override val serializersModule: SerializersModule get() = json.serializersModule +private class RootJsonSerializer(private val tSerializer: KSerializer) : KSerializer { private val refCache: HashMap = HashMap() + + override val descriptor: SerialDescriptor get() = tSerializer.descriptor + + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + return input.json.decodeFromJsonElement(tSerializer, transformDeserialize(element)) + } + + override fun serialize(encoder: Encoder, value: T) { + tSerializer.serialize(encoder, value) + } + override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { val match = refRegex.matchEntire(string) return if (match != null) { @@ -41,7 +60,7 @@ private class RootJsonSerialFormat : StringFormat { val refValue = refCache[ref] ?: error("Reference $ref unresolved") refValue as T //TODO research means to make it safe } else { - val res = json.decodeFromString(deserializer, string) + val res = rootJson.decodeFromString(deserializer, string) val uid = (res as? TObject)?.fUniqueID if (uid != null && refCache[uid] == null) { refCache[uid] = res @@ -50,17 +69,70 @@ private class RootJsonSerialFormat : StringFormat { } } + override fun encodeToString(serializer: SerializationStrategy, value: T): String = - json.encodeToString(serializer, value) + rootJson.encodeToString(serializer, value) companion object { val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() - val json: Json = Json { + val rootSerializersModule = SerializersModule { + polymorphic(TGeoShape::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + } + + polymorphic(TGeoMatrix::class) { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + } + + polymorphic(TObject::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + + subclass(TGeoMaterial.serializer()) + subclass(TGeoMixture.serializer()) + + subclass(TGeoMedium.serializer()) + + subclass(TGeoNode.serializer()) + subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoVolume.serializer()) + subclass(TGeoVolumeAssembly.serializer()) + } + polymorphic(TGeoNode::class, TGeoNode.serializer()) { + subclass(TGeoNodeMatrix.serializer()) + } + polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + subclass(TGeoVolumeAssembly.serializer()) + } + } + + val rootJson: Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" + serializersModule = rootSerializersModule } + } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt index 9094d721..f4883e0e 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt @@ -1,9 +1,12 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMaterial") public open class TGeoMaterial: TNamed() @Serializable +@SerialName("TGeoMixture") public class TGeoMixture: TGeoMaterial() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt index 196c209c..3e598753 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -1,8 +1,10 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMedium") public class TGeoMedium( public val fId : Int, public val fMaterial: TGeoMaterial, diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 2793773f..5805f3ea 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -1,9 +1,11 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -public class TGeoNode : TNamed() { +@SerialName("TGeoNode") +public open class TGeoNode : TNamed() { //val fGeoAtt: UInt public val fVolume: TGeoVolume? = null public val fMother: TGeoVolume? = null @@ -12,6 +14,8 @@ public class TGeoNode : TNamed() { public val fOverlaps: IntArray = intArrayOf() } -public class TGeoNodeMatrix : TGeoMatrix() { +@Serializable +@SerialName("TGeoNodeMatrix") +public class TGeoNodeMatrix : TGeoNode() { public val fMatrix: TGeoMatrix? = null } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index 344f5e6f..f26261da 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -1,14 +1,17 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -public abstract class TGeoShape : TNamed() { +@SerialName("TGeoShape") +public sealed class TGeoShape : TNamed() { public val fShapeBits: UInt = 0u public val fShapeId: Int = 0 } @Serializable +@SerialName("TGeoBBox") public open class TGeoBBox : TGeoShape() { public val fDX: Double = 0.0 public val fDY: Double = 0.0 @@ -17,6 +20,7 @@ public open class TGeoBBox : TGeoShape() { } @Serializable +@SerialName("TGeoBoolNode") public sealed class TGeoBoolNode : TObject() { public abstract val fLeft: TGeoShape public abstract val fLeftMat: TGeoMatrix @@ -25,6 +29,7 @@ public sealed class TGeoBoolNode : TObject() { } @Serializable +@SerialName("TGeoUnion") public class TGeoUnion( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -33,6 +38,7 @@ public class TGeoUnion( ) : TGeoBoolNode() @Serializable +@SerialName("TGeoSubtraction") public class TGeoSubtraction( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -41,6 +47,7 @@ public class TGeoSubtraction( ) : TGeoBoolNode() @Serializable +@SerialName("TGeoIntersection") public class TGeoIntersection( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -50,9 +57,11 @@ public class TGeoIntersection( @Serializable +@SerialName("TGeoCompositeShape") public class TGeoCompositeShape(public val fNode: TGeoBoolNode) : TGeoBBox() @Serializable +@SerialName("TGeoXtru") public class TGeoXtru( public val fNvert: Int, public val fNz: Int, @@ -67,14 +76,33 @@ public class TGeoXtru( @Serializable -public class TGeoTube( +@SerialName("TGeoTube") +public open class TGeoTube( public val fRmin: Double, public val fRmax: Double, public val fDz: Double, ) : TGeoBBox() @Serializable +@SerialName("TGeoTubeSeg") +public class TGeoTubeSeg( + public val fRmin: Double, + public val fRmax: Double, + public val fDz: Double, + public val fPhi1: Double, + public val fPhi2: Double, + public val fS1: Double, + public val fC1: Double, + public val fS2: Double, + public val fC2: Double, + public val fSm: Double, + public val fCm: Double, + public val fCdfi: Double, +) : TGeoBBox() + +@Serializable +@SerialName("TGeoShapeAssembly") public class TGeoShapeAssembly( public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true -): TGeoBBox() \ No newline at end of file +) : TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index 1bd12cbf..dc986729 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -1,8 +1,10 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoVolume") public open class TGeoVolume : TNamed(){ // "fGeoAtt" : 3084, // "fLineColor" : 3, @@ -19,4 +21,5 @@ public open class TGeoVolume : TNamed(){ } @Serializable +@SerialName("TGeoVolumeAssembly") public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index fb17d8ac..bf528e6f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @@ -15,6 +16,7 @@ public abstract class TNamed : TObject() { } @Serializable +@SerialName("TObjArray") public class TObjArray(public val arr: List){ public companion object{ public val empty = TObjArray(emptyList()) diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt new file mode 100644 index 00000000..5d3a03af --- /dev/null +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt @@ -0,0 +1,7 @@ +package ru.mipt.npm.root + +fun main() { + val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! + .readAllBytes().decodeToString() + val geo = TGeoManager.decodeFromString(string) +} \ No newline at end of file -- 2.34.1 From 829d0dfde7f9b7d4f3b86d55b94dd109238a6638 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:24:41 +0300 Subject: [PATCH 016/143] Fix Jupyter Kapt problem --- demo/jupyter-playground/build.gradle.kts | 4 ++-- .../VisionForgePlayGroundForJupyter.kt | 4 ++-- demo/playground/build.gradle.kts | 18 +++++++++--------- gradle.properties | 2 ++ 4 files changed, 15 insertions(+), 13 deletions(-) rename demo/jupyter-playground/src/main/kotlin/{hep/dataforge/playground => }/VisionForgePlayGroundForJupyter.kt (96%) diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts index 903b991b..62f92348 100644 --- a/demo/jupyter-playground/build.gradle.kts +++ b/demo/jupyter-playground/build.gradle.kts @@ -5,6 +5,7 @@ plugins { } repositories { + jcenter() mavenCentral() maven("https://repo.kotlin.link") } @@ -15,7 +16,6 @@ dependencies { tasks.withType { kotlinOptions { - useIR = true jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() } } @@ -29,7 +29,7 @@ tasks.withType { } tasks.processJupyterApiResources { - libraryProducers = listOf("space.kscience.dataforge.playground.VisionForgePlayGroundForJupyter") + libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") } tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 96% rename from demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt rename to demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 88e4effb..12426672 100644 --- a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,4 +1,4 @@ -package space.kscience.dataforge.playground +package playground import kotlinx.html.div import kotlinx.html.id @@ -24,7 +24,7 @@ import space.kscience.visionforge.visionManager @JupyterLibrary @DFExperimental -internal class VisionForgePlayGroundForJupyter : JupyterIntegration() { +public class VisionForgePlayGroundForJupyter : JupyterIntegration() { private val context = Context("VisionForge") { plugin(Solids) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index a89fe123..515cb165 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,25 +51,25 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation(project(":visionforge-solid")) - implementation(project(":visionforge-gdml")) - implementation(project(":visionforge-plotly")) - implementation(projects.visionforge.visionforgeMarkdown) + api(project(":visionforge-solid")) + api(project(":visionforge-gdml")) + api(project(":visionforge-plotly")) + api(projects.visionforge.visionforgeMarkdown) } } val jsMain by getting{ dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) + api(project(":ui:ring")) + api(project(":visionforge-threejs")) } } val jvmMain by getting{ dependencies { - implementation(project(":visionforge-server")) - implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + api(project(":visionforge-server")) + api("ch.qos.logback:logback-classic:1.2.3") + api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..511d4130 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kotlin.jupyter.add.scanner=false + org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file -- 2.34.1 From 7103f49ff96b8f89105a059dadbe29c90b0d7900 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Fri, 20 Aug 2021 20:26:21 +0300 Subject: [PATCH 017/143] Raw version of everything --- docs/hierarchy.md | 44 +++++++++++++---- docs/inheritance.md | 6 +-- docs/uml/Vision.puml | 114 ++++++++++++++++++++++++------------------- gradle.properties | 2 + 4 files changed, 105 insertions(+), 61 deletions(-) diff --git a/docs/hierarchy.md b/docs/hierarchy.md index a4097221..2427cec7 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -1,17 +1,43 @@ # Hierarchy -![](../docs/images/hierarchy.png) -**the image will be changed** +![](../docs/images/hierarchy.png) ### Vision +* function `getPropertyValue(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. -* function `getProperty(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean)`. +* function `setProperty(name: Name, item: Any?)` - a convenient method to set property node or value. If `item` is null, then node is removed, not a value + Sets the `item` property to the element with the `name` identification. -It gets properties of element with `name` identification. -`inherit` — toggles parent node property lookup. Null means inference from descriptor. Default is false. -`includeStyles` — toggles inclusion of. Null means inference from descriptor. Default is true. -`includeDefaults` — default is false. +### VisionBase -* function `setProperty(name: Name, item: MetaItem?, notify: Boolean = true)` +Basic vision implementation -Sets the `item` property to the element with the `name` identification. `notify` is a value which toggles the necessity of the change notification. Default is true. +### VisionGroup + +A group of Visions. + +### MutableVisionGroup + +Mutable version of VisionGroup. + +low structure changes of this group. Unconsumed changes are discarded. + +### Solid + +Interface for 3-dimensional Vision. + +### SolidGroup + +* function `getPrototype(name: Name)` - get a prototype redirecting the request to the parent if prototype is not found. If prototype is a ref, then it is unfolded automatically. + +* function `prototypes(builder: VisionContainerBuilder.() -> Unit)` - create or edit prototype node as a group. + +### SolidReferenceGroup + +A reference Solid to reuse a template object. + +### RootVisionGroup + +Non-serializable root group used to propagate manager to its children. + +* function Vision.root(manager: VisionManager) - designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent. diff --git a/docs/inheritance.md b/docs/inheritance.md index c156bbda..079d1940 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -37,9 +37,9 @@ Properties, which can or cannot be inherited, are these: ![](../docs/images/inheritance-2-1-2.png) * `material` - a group of properties, which can be inherited and which can be changed in `children` elements. - * `color` - color of an element. - * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). - * `wireframe` - toggles the wireframe mode. + * `color` - color of an element. + * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). + * `wireframe` - toggles the wireframe mode. Let's see how elements of the `material` group inherit changing `color` property; ***other properties of this group inherit in the same way.*** diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index bb3143cc..2b4d9953 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -1,108 +1,124 @@ @startuml 'https://plantuml.com/class-diagram -interface Vision +interface Vision{ + val parent: VisionGroup? + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} -interface Solid -Vision <- Solid +interface Solid{ + The base for 3D geometry +} +Vision <-- Solid +class VisionGroup{ + A group of Visions -class VisionGroup + val children: Map + val defaultTarget: String + + fun content(target): Map + fun get(name: Name): Vision? +} Vision <-- VisionGroup -class VisionBase -Vision <- VisionBase +class VisionBase{ + basic vision implementation +} +Vision <-- VisionBase class SolidLabel Solid <--- SolidLabel -SolidBase <-- SolidLabel -class SolidGroup +class SolidGroup{ + var properties: MutableMeta? + val children: Map + var prototypes: MutableVisionGroup? + + fun getPrototype(name): Solid? + fun prototypes(builder) +} Solid <--- SolidGroup VisionGroupBase <-- SolidGroup -class SolidBase -Solid <--- SolidBase -VisionBase <-- SolidBase - - class SphereLayer -SolidBase <-- SphereLayer -GeometrySolid <-- SphereLayer +Solid <-- SphereLayer class Sphere -SolidBase <-- Sphere -GeometrySolid <-- Sphere +Solid <-- Sphere class Box -SolidBase <-- Box Hexagon <-- Box class GenericHexagon -SolidBase <-- GenericHexagon Hexagon <-- GenericHexagon class Extruded -SolidBase <-- Extruded -GeometrySolid <-- Extruded +Solid <-- Extruded class PolyLine Solid <--- PolyLine -SolidBase <-- PolyLine - -interface GeometrySolid -Solid <--- GeometrySolid interface Hexagon -GeometrySolid <-- Hexagon +Solid <-- Hexagon class ConeSegment -GeometrySolid <-- ConeSegment +Solid <-- ConeSegment class ConeSurface -GeometrySolid <-- ConeSurface +Solid <-- ConeSurface class Convex Solid <--- Convex -SolidBase <-- Convex class Composite Solid <--- Composite -SolidBase <-- Composite -interface SolidReference +interface SolidReference{ + val prototype: Solid + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} VisionGroup <---- SolidReference -interface MutableVisionGroup +class SolidReferenceGroup{ + val refName: Name + var properties: MutableMeta? + val prototype: Solid + val children: Map + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} +VisionBase <-- SolidReferenceGroup + +interface MutableVisionGroup{ + fun onStructureChanged(owner, block) + fun removeStructureListener(owner) +} VisionGroup <---- MutableVisionGroup -class SolidReferenceGroup -VisionGroup <-- SolidReferenceGroup -Solid <-- SolidReferenceGroup -VisionBase <-- SolidReferenceGroup -SolidReference <-- SolidReferenceGroup - -class ReferenceChild -VisionGroup <-- ReferenceChild -Solid <-- ReferenceChild -SolidReference <-- ReferenceChild - - -class VisionGroupBase +class VisionGroupBase{ + val children: Map + fun set(name: Name?, child: Vision?) +} VisionBase <-- VisionGroupBase MutableVisionGroup <-- VisionGroupBase - - class RootVisionGroup VisionGroupBase <-- RootVisionGroup - -class VisionOfPlotly +class VisionOfPlotly{ + var properties: MutableMeta? + val plot: Plot +} VisionBase <-- VisionOfPlotly + +class VisionOfMarkup{ + val format: String + var content: String? +} +VisionBase <-- VisionOfMarkup @enduml \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..0659c12d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,8 @@ kotlin.code.style=official kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kapt.use.worker.api=false +kapt.incremental.apt=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file -- 2.34.1 From 02df77e97e6d78b466f13acf56aef135032cc161 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:36:23 +0300 Subject: [PATCH 018/143] Fix Kapt problem --- gradle.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 511d4130..2ffacd8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,5 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false -kotlin.jupyter.add.scanner=false - org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file -- 2.34.1 From 1b2d61008f4d8602d0ca4735fdfed89591702376 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 21 Aug 2021 10:53:36 +0300 Subject: [PATCH 019/143] WIP root unref --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 123 +----------------- .../kotlin/ru/mipt/npm/root/rootJson.kt | 107 +++++++++++++++ 2 files changed, 114 insertions(+), 116 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index acf4d712..3b3eecf5 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,15 +1,9 @@ package ru.mipt.npm.root -import kotlinx.serialization.* -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonDecoder -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.decodeFromJsonElement @Serializable @SerialName("TGeoManager") @@ -26,113 +20,10 @@ public class TGeoManager : TNamed() { /** * Load Json encoded TGeoManager */ - public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + public fun decodeFromJson(jsonElement: JsonElement): TGeoManager = + rootJson().decodeFromJsonElement(jsonElement) public fun decodeFromString(string: String): TGeoManager = - Root().decodeFromString(serializer(), string) + rootJson().decodeFromString(serializer(), string) } } - -@OptIn(ExperimentalSerializationApi::class) -private class RootJsonSerializer(private val tSerializer: KSerializer) : KSerializer { - - private val refCache: HashMap = HashMap() - - - override val descriptor: SerialDescriptor get() = tSerializer.descriptor - - - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - return input.json.decodeFromJsonElement(tSerializer, transformDeserialize(element)) - } - - override fun serialize(encoder: Encoder, value: T) { - tSerializer.serialize(encoder, value) - } - - override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { - val match = refRegex.matchEntire(string) - return if (match != null) { - //Do unref - val ref = match.value.toUIntOrNull() ?: error("Ref value is not a number") - val refValue = refCache[ref] ?: error("Reference $ref unresolved") - refValue as T //TODO research means to make it safe - } else { - val res = rootJson.decodeFromString(deserializer, string) - val uid = (res as? TObject)?.fUniqueID - if (uid != null && refCache[uid] == null) { - refCache[uid] = res - } - res - } - } - - - override fun encodeToString(serializer: SerializationStrategy, value: T): String = - rootJson.encodeToString(serializer, value) - - companion object { - val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() - - val rootSerializersModule = SerializersModule { - polymorphic(TGeoShape::class) { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoShapeAssembly.serializer()) - } - - polymorphic(TGeoMatrix::class) { - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - } - - polymorphic(TObject::class) { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoShapeAssembly.serializer()) - - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - - subclass(TGeoMaterial.serializer()) - subclass(TGeoMixture.serializer()) - - subclass(TGeoMedium.serializer()) - - subclass(TGeoNode.serializer()) - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - } - polymorphic(TGeoNode::class, TGeoNode.serializer()) { - subclass(TGeoNodeMatrix.serializer()) - } - polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { - subclass(TGeoVolumeAssembly.serializer()) - } - } - - val rootJson: Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = rootSerializersModule - } - - } - -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt new file mode 100644 index 00000000..f0b25d18 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -0,0 +1,107 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.PolymorphicModuleBuilder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + + +private typealias RefCache = MutableList + +private class RootJsonSerializer( + private val refCache: RefCache, + private val tSerializer: KSerializer +) : KSerializer { + + override val descriptor: SerialDescriptor get() = tSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + return if (refId != null) { + //Do unref + val refValue = refCache[refId] + refValue as T //TODO research means to make it safe + } else { + val res = input.json.decodeFromJsonElement(tSerializer, element) + //val uid = res.fUniqueID + refCache.add(res) + res + } + } + + override fun serialize(encoder: Encoder, value: T) { + tSerializer.serialize(encoder, value) + } + +} + +private fun KSerializer.unref(refCache: RefCache): RootJsonSerializer = + RootJsonSerializer(refCache, this) + + +private fun PolymorphicModuleBuilder.shapes(refCache: RefCache) { + subclass(TGeoBBox.serializer().unref(refCache)) + subclass(TGeoCompositeShape.serializer().unref(refCache)) + subclass(TGeoXtru.serializer().unref(refCache)) + subclass(TGeoTube.serializer().unref(refCache)) + subclass(TGeoTubeSeg.serializer().unref(refCache)) + subclass(TGeoShapeAssembly.serializer().unref(refCache)) +} + +private fun PolymorphicModuleBuilder.matrices(refCache: RefCache) { + subclass(TGeoIdentity.serializer().unref(refCache)) + subclass(TGeoHMatrix.serializer().unref(refCache)) + subclass(TGeoTranslation.serializer().unref(refCache)) + subclass(TGeoRotation.serializer().unref(refCache)) + subclass(TGeoCombiTrans.serializer().unref(refCache)) +} + +/** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ +internal fun rootJson(): Json { + val refCache = ArrayList(4096) + return Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = SerializersModule { + polymorphic(TGeoShape::class) { + default { TGeoBBox.serializer().unref(refCache) } + shapes(refCache) + } + + polymorphic(TGeoMatrix::class) { + matrices(refCache) + } + + polymorphic(TObject::class) { + shapes(refCache) + matrices(refCache) + + subclass(TGeoMaterial.serializer().unref(refCache)) + subclass(TGeoMixture.serializer().unref(refCache)) + + subclass(TGeoMedium.serializer().unref(refCache)) + + subclass(TGeoNode.serializer().unref(refCache)) + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + subclass(TGeoVolume.serializer().unref(refCache)) + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + } + polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + } + polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + } + } + } +} \ No newline at end of file -- 2.34.1 From 9b6cdd0166c0b3713d30afbf4e824be931f6451c Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sat, 21 Aug 2021 21:15:16 +0300 Subject: [PATCH 020/143] Changes in documentation --- README.md | 2 +- docs/hierarchy.md | 11 +++++++-- docs/images/hierarchy.png | Bin 27217 -> 156172 bytes docs/inheritance.md | 22 ++++++++++-------- docs/uml/Vision.puml | 2 ++ .../space/kscience/visionforge/VisionBase.kt | 2 +- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 621f474f..b89b0ea9 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHo ##### Styles -`SolidGroup` has a `styleSheet` property that can optionally define styles at the Group's +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. diff --git a/docs/hierarchy.md b/docs/hierarchy.md index 2427cec7..720af5d2 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -27,6 +27,7 @@ low structure changes of this group. Unconsumed changes are discarded. Interface for 3-dimensional Vision. ### SolidGroup +3D Visual Group with a container for templates visible inside this group. It has an interface `PrototypeHolder` which stands for being a container with prototype support. * function `getPrototype(name: Name)` - get a prototype redirecting the request to the parent if prototype is not found. If prototype is a ref, then it is unfolded automatically. @@ -34,10 +35,16 @@ Interface for 3-dimensional Vision. ### SolidReferenceGroup -A reference Solid to reuse a template object. +A class with `SolidReference` interface with reference `Solid`s for template objects reuse. + +### VisionGroupBase + +Abstract implementation of mutable group of `Vision`. ### RootVisionGroup Non-serializable root group used to propagate manager to its children. -* function Vision.root(manager: VisionManager) - designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent. +### MutableVisionGroup + +Just a mutable version of `VisionGroup` \ No newline at end of file diff --git a/docs/images/hierarchy.png b/docs/images/hierarchy.png index e202c6afaa746ea54011d46fe48f1d0faae43c5a..9e9394ac820854b0a07c2dd5802f13d0c6635f45 100644 GIT binary patch literal 156172 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

dBgGqQDci9iUeII^B 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 literal 27217 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 F{{WiZ#M1x( diff --git a/docs/inheritance.md b/docs/inheritance.md index 079d1940..d57bed71 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,6 +2,7 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. + Properties have to be set in a specific order: ### Main properties' inheritance: * styles @@ -16,8 +17,9 @@ As for `prototypes`, this property has to be set after styles, but before parent * parents * parent's styles * defaults ------------------------- -Let's take a closer look using a [Muon Monitor Visualization](demo/muon-monitor/README.md). + + +Let's take a closer look using a [Muon Monitor Visualization](../demo/muon-monitor/README.md). Running the demo, we will see this: ![](../docs/images/inheritance-1.png) @@ -31,15 +33,15 @@ On the right, there is a list with changeable properties. ![](../docs/images/inheritance-properties.png) Properties, which can or cannot be inherited, are these: -* `visible` - toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. +* `visible` – toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. If a `parent` element is invisible, other elements are invisible as well, and they cannot be changed to visible mode. ![](../docs/images/inheritance-2-1-1.png) ![](../docs/images/inheritance-2-1-2.png) -* `material` - a group of properties, which can be inherited and which can be changed in `children` elements. - * `color` - color of an element. - * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). - * `wireframe` - toggles the wireframe mode. +* `material` – a group of properties, which can be inherited and which can be changed in `children` elements. + * `color` – color of an element. + * `opacity` – a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). + * `wireframe` – toggles the wireframe mode. Let's see how elements of the `material` group inherit changing `color` property; ***other properties of this group inherit in the same way.*** @@ -51,7 +53,7 @@ Properties, which can or cannot be inherited, are these: ![](../docs/images/inheritance-2-2-2.png) It changes only, 'bottom' and 'middle' stays the same. - 'top' is a `parent` element as well: it has `children` - 'SC72', 'SC73', ... ,'SC80'. + 'top' is a `parent` element as well: it has `children` – 'SC72', 'SC73', ... ,'SC80'. Let's change the color of 'SC76': ![](../docs/images/inheritance-2-2-3.png) Again, only 'SC76' has changed among other 'siblings'. @@ -64,5 +66,5 @@ Properties, which can or cannot be inherited, are these: If after all those changes we set at the 'World' element grey color, changes won't disappear: ![](../docs/images/inheritance-2-2-5.png) -* `rotation` - rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. -* `position` - position of an element, cannot be inherited. +* `rotation` – rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. +* `position` – position of an element, cannot be inherited. diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 2b4d9953..04e873b9 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -84,6 +84,7 @@ interface SolidReference{ fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? } VisionGroup <---- SolidReference +SolidReferenceGroup -- SolidReference class SolidReferenceGroup{ val refName: Name @@ -93,6 +94,7 @@ class SolidReferenceGroup{ fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? } VisionBase <-- SolidReferenceGroup +VisionGroup <-- SolidReferenceGroup interface MutableVisionGroup{ fun onStructureChanged(owner, block) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 74f173ae..dce9bbd5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -23,7 +23,7 @@ internal data class MetaListener( /** * A full base implementation for a [Vision] - * @param parent the parent object for this vision. Could ve set later. Not serialized. + * @param parent the parent object for this vision. Could've set later. Not serialized. */ @Serializable @SerialName("vision") -- 2.34.1 From 0b4fea5ff117f9e04d6a15b37845815c1a8828b7 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sat, 21 Aug 2021 21:15:33 +0300 Subject: [PATCH 021/143] Changes in documentation --- ...patial-showcase-FX.png => solid-showcase-FX.png} | Bin .../{spatial-showcase.png => solid-showcase.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/images/{spatial-showcase-FX.png => solid-showcase-FX.png} (100%) rename docs/images/{spatial-showcase.png => solid-showcase.png} (100%) diff --git a/docs/images/spatial-showcase-FX.png b/docs/images/solid-showcase-FX.png similarity index 100% rename from docs/images/spatial-showcase-FX.png rename to docs/images/solid-showcase-FX.png diff --git a/docs/images/spatial-showcase.png b/docs/images/solid-showcase.png similarity index 100% rename from docs/images/spatial-showcase.png rename to docs/images/solid-showcase.png -- 2.34.1 From 5f07bf1920a761af865d38672963d3d7a72fe139 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 13:25:57 +0300 Subject: [PATCH 022/143] pre-change of README.md --- README.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b89b0ea9..032b7ee4 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,13 @@ * [About DataForge](#about-dataforge) * [Modules contained in this repository](#modules-contained-in-this-repository) * [visionforge-core](#visionforge-core) - * [visionforge-solid](#visionforge-solid) + * [visionforge-fx](#visionforge-fx) * [visionforge-gdml](#visionforge-gdml) + * [visionforge-markdown](#visionforge-markdown) + * [visionforge-plotly](#visionforge-plotly) + * [visionforge-server](#visionforge-server) + * [visionforge-solid](#visionforge-solid) + * [visionforge-threejs](#visionforge-threejs) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) * [Simple Example - Solid Showcase](#simple-example---solid-showcase) @@ -75,6 +80,17 @@ The `visionforge-core` module also includes configuration editors for JS (in `js ![](docs/images/class-diag-core.png) +### visionforge-fx + +### visionforge-gdml + +GDML bindings for 3D visualization (to be moved to gdml project). + +### visionforge-markdown + +### visionforge-plotly + +### visionforge-server ### visionforge-solid @@ -96,13 +112,9 @@ The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHo ##### Styles `VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's -level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. - - -### visionforge-gdml - -GDML bindings for 3D visualization (to be moved to gdml project). +level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. +### visionforge-threejs ## Visualization for External Systems -- 2.34.1 From 51b8ae279a82281d8f3cc61a837474623fa8f752 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 14:56:31 +0300 Subject: [PATCH 023/143] pre-change of README.md --- docs/inheritance.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/inheritance.md b/docs/inheritance.md index d57bed71..88dc85b8 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,18 +2,20 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. - +`VisionBase` Properties have to be set in a specific order: ### Main properties' inheritance: -* styles +* styles - `StyleSheet` * parents * parent's styles * defaults + +`SolidReference` As for `prototypes`, this property has to be set after styles, but before parents. So the order will be this: ### Reference properties' inheritance: * styles -* prototypes +* prototypes - `PrototypeHolder` in `SolidGroup` * parents * parent's styles * defaults -- 2.34.1 From 59bc5415403f1e0e1b4b3c5d04abbc720f6de28a Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 18:10:05 +0300 Subject: [PATCH 024/143] pilot version of inheritance.md --- docs/inheritance.md | 21 +++++++------------ .../space/kscience/visionforge/Vision.kt | 4 ++-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/docs/inheritance.md b/docs/inheritance.md index 88dc85b8..d99451f3 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,21 +2,16 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. -`VisionBase` -Properties have to be set in a specific order: -### Main properties' inheritance: -* styles - `StyleSheet` -* parents -* parent's styles -* defaults +Properties, which can be inherited by objects, are `styles`, `prototypes` (if the object is a reference), `inherit` (it stands for the presence of `parent` objects), and `defaults`. +All values of `styles` property are contained in class `StyleSheet`, where they all are defined at `Group`s level. The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +`SolidReference` class helps to reuse a template object. -`SolidReference` -As for `prototypes`, this property has to be set after styles, but before parents. So the order will be this: -### Reference properties' inheritance: -* styles -* prototypes - `PrototypeHolder` in `SolidGroup` -* parents +The order of inheritance of properties is set in function `getPropertyValue` in `VisionBase` class. +The order is this: +* own styles +* prototypes +* parent * parent's styles * defaults diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 924dfdd1..1c8e3a28 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -36,7 +36,7 @@ public interface Vision : Described, Configurable { public val manager: VisionManager? get() = parent?.manager /** - * This Vision own properties (ignoring inheritance, styles and defaults + * This Vision own properties (ignoring inheritance, styles and defaults) */ override val meta: ObservableMutableMeta @@ -92,7 +92,7 @@ public val Vision.propertyChanges: Flow } /** - * Subscribe on property updates. The subscription is bound to the given [scope] and canceled when the scope is canceled + * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled */ public fun Vision.onPropertyChange(callback: Meta.(Name) -> Unit) { meta.onChange(null, callback) -- 2.34.1 From 64e084dc533e49be886385b06edd8366ce341565 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 22 Aug 2021 22:39:47 +0300 Subject: [PATCH 025/143] WIP root unref --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 22 +- .../root/{TGeoHMatrix.kt => TGeoMatrix.kt} | 6 +- .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 6 +- .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 5 + .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 21 ++ .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 12 +- .../kotlin/ru/mipt/npm/root/TObject.kt | 16 +- .../kotlin/ru/mipt/npm/root/rootJson.kt | 280 +++++++++++++----- .../kotlin/ru/mipt/npm/root/loadBM@N.kt | 26 +- 9 files changed, 286 insertions(+), 108 deletions(-) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{TGeoHMatrix.kt => TGeoMatrix.kt} (90%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 3b3eecf5..96b02768 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,29 +1,19 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.decodeFromJsonElement @Serializable @SerialName("TGeoManager") public class TGeoManager : TNamed() { + @Contextual public val fMatrices: TObjArray = TObjArray.empty + + @Contextual public val fShapes: TObjArray = TObjArray.empty + + @Contextual public val fVolumes: TObjArray = TObjArray.empty - - - public companion object { - - - /** - * Load Json encoded TGeoManager - */ - public fun decodeFromJson(jsonElement: JsonElement): TGeoManager = - rootJson().decodeFromJsonElement(jsonElement) - - public fun decodeFromString(string: String): TGeoManager = - rootJson().decodeFromString(serializer(), string) - } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt similarity index 90% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt index 3e1362f8..0c6ec7ab 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,11 +31,12 @@ public class TGeoTranslation( @SerialName("TGeoRotation") public class TGeoRotation( public val fRotationMatrix: DoubleArray -): TGeoMatrix() +) : TGeoMatrix() @Serializable @SerialName("TGeoCombiTrans") public class TGeoCombiTrans( public val fTranslation: DoubleArray, + @Contextual public val fRotation: TGeoRotation? = null, -): TGeoMatrix() \ No newline at end of file +) : TGeoMatrix() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt index 3e598753..72b72c4c 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -1,12 +1,14 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoMedium") public class TGeoMedium( - public val fId : Int, + public val fId: Int, + @Contextual public val fMaterial: TGeoMaterial, public val fParams: DoubleArray -): TNamed() \ No newline at end of file +) : TNamed() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 5805f3ea..f507aeb2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -7,7 +8,10 @@ import kotlinx.serialization.Serializable @SerialName("TGeoNode") public open class TGeoNode : TNamed() { //val fGeoAtt: UInt + @Contextual public val fVolume: TGeoVolume? = null + + @Contextual public val fMother: TGeoVolume? = null public val fNumber: Int = 0 public val fNovlp: Int = 0 @@ -17,5 +21,6 @@ public open class TGeoNode : TNamed() { @Serializable @SerialName("TGeoNodeMatrix") public class TGeoNodeMatrix : TGeoNode() { + @Contextual public val fMatrix: TGeoMatrix? = null } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index f26261da..c986f899 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -22,36 +23,55 @@ public open class TGeoBBox : TGeoShape() { @Serializable @SerialName("TGeoBoolNode") public sealed class TGeoBoolNode : TObject() { + @Contextual public abstract val fLeft: TGeoShape + + @Contextual public abstract val fLeftMat: TGeoMatrix + + @Contextual public abstract val fRight: TGeoShape + + @Contextual public abstract val fRightMat: TGeoMatrix } @Serializable @SerialName("TGeoUnion") public class TGeoUnion( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @SerialName("TGeoSubtraction") public class TGeoSubtraction( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @SerialName("TGeoIntersection") public class TGeoIntersection( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @@ -103,6 +123,7 @@ public class TGeoTubeSeg( @Serializable @SerialName("TGeoShapeAssembly") public class TGeoShapeAssembly( + @Contextual public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true ) : TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index dc986729..afa7c7d9 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -1,20 +1,30 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoVolume") -public open class TGeoVolume : TNamed(){ +public open class TGeoVolume : TNamed() { // "fGeoAtt" : 3084, // "fLineColor" : 3, // "fLineStyle" : 1, // "fLineWidth" : 1, // "fFillColor" : 19, // "fFillStyle" : 1001, + @Contextual public lateinit var fNodes: TObjArray + internal set + + @Contextual public lateinit var fShape: TGeoShape + internal set + + @Contextual public lateinit var fMedium: TGeoMedium + internal set + public val fNumber: Int = 1 public val fNtotal: Int = 1 public val fRefCount: Int = 1 diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index bf528e6f..f70cc589 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -10,15 +10,23 @@ public abstract class TObject { } @Serializable -public abstract class TNamed : TObject() { +public open class TNamed : TObject() { public val fName: String = "" public val fTitle: String = "" } @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List){ +public class TObjArray(public val arr: List): TObject() { public companion object{ - public val empty = TObjArray(emptyList()) + public val empty: TObjArray = TObjArray(emptyList()) } -} \ No newline at end of file +} + +@Serializable +@SerialName("TList") +public class TList(public val arr: List): TObject() + +@Serializable +@SerialName("THashList") +public class THashList(public val arr: List): TObject() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt index f0b25d18..33b8b6c2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -1,107 +1,223 @@ package ru.mipt.npm.root +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.* -import kotlinx.serialization.modules.PolymorphicModuleBuilder -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass +import kotlinx.serialization.modules.* +import kotlin.reflect.KClass -private typealias RefCache = MutableList +/** + * Load Json encoded TObject + */ +public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): TObject = + RootDecoder.decode(serializer, jsonElement) -private class RootJsonSerializer( - private val refCache: RefCache, - private val tSerializer: KSerializer -) : KSerializer { +public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): TObject { + val json = RootDecoder.json.parseToJsonElement(string) + return RootDecoder.decode(serializer, json) +} - override val descriptor: SerialDescriptor get() = tSerializer.descriptor +private object RootDecoder { - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int - return if (refId != null) { - //Do unref - val refValue = refCache[refId] - refValue as T //TODO research means to make it safe - } else { - val res = input.json.decodeFromJsonElement(tSerializer, element) - //val uid = res.fUniqueID - refCache.add(res) - res + private class RootUnrefSerializer( + private val tSerializer: KSerializer, + private val refCache: MutableList,// = ArrayList(4096) + private val counter: ReferenceCounter + ) : KSerializer by tSerializer { + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + val ref = if (refId != null) { + //Do unref + refCache[refId] + } else { + refCache[counter.value].also { + counter.increment() + } + } + return ref.value(tSerializer) as T //TODO research means to make it safe } } - override fun serialize(encoder: Encoder, value: T) { - tSerializer.serialize(encoder, value) + private fun KSerializer.unref(refCache: MutableList, counter: ReferenceCounter): KSerializer = + RootUnrefSerializer(this, refCache, counter) + + @OptIn(ExperimentalSerializationApi::class) + fun unrefSerializersModule( + refCache: MutableList, counter: ReferenceCounter + ): SerializersModule = SerializersModule { + val collector = this + val unrefCollector = object : SerializersModuleCollector { + + override fun contextual( + kClass: KClass, + provider: (typeArgumentsSerializers: List>) -> KSerializer<*> + ) { + collector.contextual(kClass) { provider(it).unref(refCache, counter) } + } + + override fun polymorphic( + baseClass: KClass, + actualClass: KClass, + actualSerializer: KSerializer + ) { + collector.polymorphic(baseClass, actualClass, actualSerializer.unref(refCache, counter)) + } + + override fun polymorphicDefault( + baseClass: KClass, + defaultSerializerProvider: (className: String?) -> DeserializationStrategy? + ) { + collector.polymorphicDefault(baseClass) { + (defaultSerializerProvider(it) as KSerializer).unref(refCache, counter) + } + } + } + serializersModule.dumpTo(unrefCollector) } -} - -private fun KSerializer.unref(refCache: RefCache): RootJsonSerializer = - RootJsonSerializer(refCache, this) - - -private fun PolymorphicModuleBuilder.shapes(refCache: RefCache) { - subclass(TGeoBBox.serializer().unref(refCache)) - subclass(TGeoCompositeShape.serializer().unref(refCache)) - subclass(TGeoXtru.serializer().unref(refCache)) - subclass(TGeoTube.serializer().unref(refCache)) - subclass(TGeoTubeSeg.serializer().unref(refCache)) - subclass(TGeoShapeAssembly.serializer().unref(refCache)) -} - -private fun PolymorphicModuleBuilder.matrices(refCache: RefCache) { - subclass(TGeoIdentity.serializer().unref(refCache)) - subclass(TGeoHMatrix.serializer().unref(refCache)) - subclass(TGeoTranslation.serializer().unref(refCache)) - subclass(TGeoRotation.serializer().unref(refCache)) - subclass(TGeoCombiTrans.serializer().unref(refCache)) -} - -/** - * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. - */ -internal fun rootJson(): Json { - val refCache = ArrayList(4096) - return Json { + /** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ + private fun unrefJson(refCache: MutableList, counter: ReferenceCounter): Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" - serializersModule = SerializersModule { - polymorphic(TGeoShape::class) { - default { TGeoBBox.serializer().unref(refCache) } - shapes(refCache) - } + serializersModule = unrefSerializersModule(refCache, counter) + } - polymorphic(TGeoMatrix::class) { - matrices(refCache) - } - polymorphic(TObject::class) { - shapes(refCache) - matrices(refCache) + fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { + val counter = ReferenceCounter() + val refCache = ArrayList() - subclass(TGeoMaterial.serializer().unref(refCache)) - subclass(TGeoMixture.serializer().unref(refCache)) - - subclass(TGeoMedium.serializer().unref(refCache)) - - subclass(TGeoNode.serializer().unref(refCache)) - subclass(TGeoNodeMatrix.serializer().unref(refCache)) - subclass(TGeoVolume.serializer().unref(refCache)) - subclass(TGeoVolumeAssembly.serializer().unref(refCache)) - } - polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { - subclass(TGeoNodeMatrix.serializer().unref(refCache)) - } - polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { - subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + fun fillCache(element: JsonElement) { + when (element) { + is JsonObject -> { + if (element["_typename"] != null) { + refCache.add(RefEntry(element)) + } + element.values.forEach { + fillCache(it) + } + } + is JsonArray -> { + element.forEach { + fillCache(it) + } + } + else -> { + } } } + fillCache(source) + + return unrefJson(refCache, counter).decodeFromJsonElement(sourceDeserializer.unref(refCache, counter), source) } + + class ReferenceCounter(var value: Int = 0) { + fun increment() { + value += 1 + } + + override fun toString(): String = value.toString() + } + + class RefEntry(val obj: JsonObject) { + + private var cachedValue: Any? = null + + fun value(serializer: KSerializer<*>): Any { + if (cachedValue == null) { + cachedValue = json.decodeFromJsonElement(serializer, obj) + } + return cachedValue!! + } + + override fun toString(): String = obj.toString() + } + + private fun PolymorphicModuleBuilder.shapes() { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + } + + private fun PolymorphicModuleBuilder.matrices() { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + } + + private fun PolymorphicModuleBuilder.boolNodes() { + subclass(TGeoIntersection.serializer()) + subclass(TGeoUnion.serializer()) + subclass(TGeoSubtraction.serializer()) + } + + private val serializersModule = SerializersModule { + contextual(TGeoManager::class) { TGeoManager.serializer() } + contextual(TObjArray::class) { TObjArray.serializer() } + contextual(TGeoVolumeAssembly::class) { TGeoVolumeAssembly.serializer() } + contextual(TGeoShapeAssembly::class) { TGeoShapeAssembly.serializer() } + contextual(TGeoRotation::class) { TGeoRotation.serializer() } + contextual(TGeoMedium::class) { TGeoMedium.serializer() } + + polymorphic(TGeoShape::class) { + default { TGeoBBox.serializer() } + shapes() + } + + polymorphic(TGeoMatrix::class) { + matrices() + } + + polymorphic(TGeoBoolNode::class) { + boolNodes() + } + + polymorphic(TObject::class) { + subclass(TObjArray.serializer()) + + shapes() + matrices() + boolNodes() + + subclass(TGeoMaterial.serializer()) + subclass(TGeoMixture.serializer()) + + subclass(TGeoMedium.serializer()) + + subclass(TGeoNode.serializer()) + subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoVolume.serializer()) + subclass(TGeoVolumeAssembly.serializer()) + } + + polymorphic(TGeoNode::class, TGeoNode.serializer()) { + subclass(TGeoNodeMatrix.serializer()) + } + + polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + subclass(TGeoVolumeAssembly.serializer()) + } + } + + val json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = this@RootDecoder.serializersModule + } + } \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt index 5d3a03af..2c2aa86c 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt @@ -1,7 +1,31 @@ package ru.mipt.npm.root +import kotlinx.serialization.json.* + +private fun JsonElement.countTypes(): Sequence = sequence { + val json = this@countTypes + when (json){ + is JsonObject -> { + json["_typename"]?.let { yield(it.jsonPrimitive.content) } + json.values.forEach { yieldAll(it.countTypes()) } + } + is JsonArray -> { + json.forEach { + yieldAll(it.countTypes()) + } + } + else -> {} + } +} + fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() - val geo = TGeoManager.decodeFromString(string) + val json = Json.parseToJsonElement(string) + val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + + val geo = TObject.decodeFromString(TGeoManager.serializer(), string) } \ No newline at end of file -- 2.34.1 From e39f79e4ab702226b0b125e1eb9fe4b4392fa25a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 24 Aug 2021 16:04:21 +0300 Subject: [PATCH 026/143] Root parsing complete --- .../kotlin/ru/mipt/npm/root/JsonRootObject.kt | 26 +++ .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 6 +- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 34 ++-- .../kotlin/ru/mipt/npm/root/TObject.kt | 8 +- .../kotlin/ru/mipt/npm/root/rootJson.kt | 149 +++++++++--------- .../mipt/npm/root/{loadBM@N.kt => loadBMN.kt} | 8 +- 7 files changed, 143 insertions(+), 96 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt rename cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/{loadBM@N.kt => loadBMN.kt} (78%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt new file mode 100644 index 00000000..bb5fd1cb --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt @@ -0,0 +1,26 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonElement + +@Serializable(JsonRootSerializer::class) +public class JsonRootObject(public val element: JsonElement): TObject() + +public object JsonRootSerializer: KSerializer{ + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): JsonRootObject { + return JsonRootObject(decoder.decodeSerializableValue(jsonElementSerializer)) + } + + override fun serialize(encoder: Encoder, value: JsonRootObject) { + encoder.encodeSerializableValue(jsonElementSerializer, value.element) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index f507aeb2..9e6f47f1 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -7,12 +7,14 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") public open class TGeoNode : TNamed() { - //val fGeoAtt: UInt + public val fGeoAtt: UInt = 0u + @Contextual public val fVolume: TGeoVolume? = null - @Contextual - public val fMother: TGeoVolume? = null +// @Contextual +// public val fMother: TGeoVolume? = null + public val fNumber: Int = 0 public val fNovlp: Int = 0 public val fOverlaps: IntArray = intArrayOf() diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index c986f899..26cf0bab 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -126,4 +126,8 @@ public class TGeoShapeAssembly( @Contextual public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true -) : TGeoBBox() \ No newline at end of file +) : TGeoBBox() + +public class TGeoShapeRef(provider: () -> TGeoShape) : TGeoShape() { + public val value: TGeoShape by lazy(provider) +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index afa7c7d9..480c1ca7 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -7,29 +7,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoVolume") public open class TGeoVolume : TNamed() { - // "fGeoAtt" : 3084, -// "fLineColor" : 3, -// "fLineStyle" : 1, -// "fLineWidth" : 1, -// "fFillColor" : 19, -// "fFillStyle" : 1001, - @Contextual - public lateinit var fNodes: TObjArray - internal set + public val fGeoAtt: UInt = 0u + public val fLineColor: Int = 2 + public val fLineStyle: Int? = null + public val fLineWidth: UInt = 1u + public val fFillColor: Int? = null + public val fFillStyle: Int? = null @Contextual - public lateinit var fShape: TGeoShape - internal set + public val fNodes: TObjArray? = null @Contextual - public lateinit var fMedium: TGeoMedium - internal set + public val fShape: TGeoShape? = null + + @Contextual + public val fMedium: TGeoMedium? = null public val fNumber: Int = 1 public val fNtotal: Int = 1 public val fRefCount: Int = 1 } +public class TGeoVolumeRef(provider: () -> TGeoVolume) : TGeoVolume() { + public val value: TGeoVolume by lazy(provider) +} + @Serializable @SerialName("TGeoVolumeAssembly") -public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file +public open class TGeoVolumeAssembly : TGeoVolume() + +public class TGeoVolumeAssemblyRef(provider: () -> TGeoVolumeAssembly) : TGeoVolumeAssembly() { + public val value: TGeoVolumeAssembly by lazy(provider) +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index f70cc589..50738d11 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,9 +16,10 @@ public open class TNamed : TObject() { public val fTitle: String = "" } + @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List): TObject() { +public class TObjArray(public val arr: List<@Contextual TObject>): TObject() { public companion object{ public val empty: TObjArray = TObjArray(emptyList()) } @@ -25,8 +27,8 @@ public class TObjArray(public val arr: List): TObject() { @Serializable @SerialName("TList") -public class TList(public val arr: List): TObject() +public class TList(public val arr: List<@Contextual TObject>): TObject() @Serializable @SerialName("THashList") -public class THashList(public val arr: List): TObject() \ No newline at end of file +public class THashList(public val arr: List<@Contextual TObject>): TObject() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt index 33b8b6c2..8416368a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -1,12 +1,10 @@ package ru.mipt.npm.root -import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.* -import kotlin.reflect.KClass /** @@ -24,8 +22,8 @@ private object RootDecoder { private class RootUnrefSerializer( private val tSerializer: KSerializer, - private val refCache: MutableList,// = ArrayList(4096) - private val counter: ReferenceCounter + private val refCache: List,// = ArrayList(4096) + //private val counter: ReferenceCounter ) : KSerializer by tSerializer { override fun deserialize(decoder: Decoder): T { @@ -33,67 +31,74 @@ private object RootDecoder { val element = input.decodeJsonElement() val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int val ref = if (refId != null) { - //Do unref - refCache[refId] - } else { - refCache[counter.value].also { - counter.increment() + //println("Substituting ref $refId") + //Forward ref for shapes + when (tSerializer.descriptor.serialName) { + "TGeoShape" -> return TGeoShapeRef{ + //Should be not null at the moment of actualization + refCache[refId].value as TGeoShape + } as T + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef{ + //Should be not null at the moment of actualization + refCache[refId].value as TGeoVolumeAssembly + } as T + //Do unref + else -> refCache[refId] } + } else { + refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") + } + + return ref.getOrPutValue { +// val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content + input.json.decodeFromJsonElement(tSerializer, it) } - return ref.value(tSerializer) as T //TODO research means to make it safe } } - private fun KSerializer.unref(refCache: MutableList, counter: ReferenceCounter): KSerializer = - RootUnrefSerializer(this, refCache, counter) + private fun KSerializer.unref(refCache: List): KSerializer = + RootUnrefSerializer(this, refCache) @OptIn(ExperimentalSerializationApi::class) fun unrefSerializersModule( - refCache: MutableList, counter: ReferenceCounter + refCache: List ): SerializersModule = SerializersModule { - val collector = this - val unrefCollector = object : SerializersModuleCollector { + include(serializersModule) - override fun contextual( - kClass: KClass, - provider: (typeArgumentsSerializers: List>) -> KSerializer<*> - ) { - collector.contextual(kClass) { provider(it).unref(refCache, counter) } - } + contextual(TGeoManager.serializer().unref(refCache)) + contextual(TObjArray.serializer().unref(refCache)) + contextual(TGeoVolumeAssembly.serializer().unref(refCache)) + contextual(TGeoShapeAssembly.serializer().unref(refCache)) + contextual(TGeoRotation.serializer().unref(refCache)) + contextual(TGeoMedium.serializer().unref(refCache)) + contextual(TGeoVolume.serializer().unref(refCache)) + contextual(TGeoMatrix.serializer().unref(refCache)) + contextual(TGeoNodeMatrix.serializer().unref(refCache)) + contextual(TGeoShape.serializer().unref(refCache)) + contextual(TObject.serializer().unref(refCache)) - override fun polymorphic( - baseClass: KClass, - actualClass: KClass, - actualSerializer: KSerializer - ) { - collector.polymorphic(baseClass, actualClass, actualSerializer.unref(refCache, counter)) - } - override fun polymorphicDefault( - baseClass: KClass, - defaultSerializerProvider: (className: String?) -> DeserializationStrategy? - ) { - collector.polymorphicDefault(baseClass) { - (defaultSerializerProvider(it) as KSerializer).unref(refCache, counter) - } - } + polymorphicDefault(TGeoShape::class) { + TGeoShape.serializer().unref(refCache) + } + + polymorphicDefault(TGeoMatrix::class) { + TGeoMatrix.serializer().unref(refCache) } - serializersModule.dumpTo(unrefCollector) } /** * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. */ - private fun unrefJson(refCache: MutableList, counter: ReferenceCounter): Json = Json { + private fun unrefJson(refCache: MutableList): Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" - serializersModule = unrefSerializersModule(refCache, counter) + serializersModule = unrefSerializersModule(refCache) } fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { - val counter = ReferenceCounter() val refCache = ArrayList() fun fillCache(element: JsonElement) { @@ -112,34 +117,35 @@ private object RootDecoder { } } else -> { + //ignore primitives } } } fillCache(source) - return unrefJson(refCache, counter).decodeFromJsonElement(sourceDeserializer.unref(refCache, counter), source) + return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) } - class ReferenceCounter(var value: Int = 0) { - fun increment() { - value += 1 - } +// class ReferenceCounter(var value: Int = 0) { +// fun increment() { +// value += 1 +// } +// +// override fun toString(): String = value.toString() +// } - override fun toString(): String = value.toString() - } + class RefEntry(val element: JsonElement) { - class RefEntry(val obj: JsonObject) { + var value: Any? = null - private var cachedValue: Any? = null - - fun value(serializer: KSerializer<*>): Any { - if (cachedValue == null) { - cachedValue = json.decodeFromJsonElement(serializer, obj) + fun getOrPutValue(builder: (JsonElement) -> T): T { + if (value == null) { + value = builder(element) } - return cachedValue!! + return value as T } - override fun toString(): String = obj.toString() + override fun toString(): String = element.toString() } private fun PolymorphicModuleBuilder.shapes() { @@ -166,27 +172,9 @@ private object RootDecoder { } private val serializersModule = SerializersModule { - contextual(TGeoManager::class) { TGeoManager.serializer() } - contextual(TObjArray::class) { TObjArray.serializer() } - contextual(TGeoVolumeAssembly::class) { TGeoVolumeAssembly.serializer() } - contextual(TGeoShapeAssembly::class) { TGeoShapeAssembly.serializer() } - contextual(TGeoRotation::class) { TGeoRotation.serializer() } - contextual(TGeoMedium::class) { TGeoMedium.serializer() } - - polymorphic(TGeoShape::class) { - default { TGeoBBox.serializer() } - shapes() - } - - polymorphic(TGeoMatrix::class) { - matrices() - } - - polymorphic(TGeoBoolNode::class) { - boolNodes() - } polymorphic(TObject::class) { + default { JsonRootSerializer } subclass(TObjArray.serializer()) shapes() @@ -202,6 +190,19 @@ private object RootDecoder { subclass(TGeoNodeMatrix.serializer()) subclass(TGeoVolume.serializer()) subclass(TGeoVolumeAssembly.serializer()) + subclass(TGeoManager.serializer()) + } + + polymorphic(TGeoShape::class) { + shapes() + } + + polymorphic(TGeoMatrix::class) { + matrices() + } + + polymorphic(TGeoBoolNode::class) { + boolNodes() } polymorphic(TGeoNode::class, TGeoNode.serializer()) { diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt similarity index 78% rename from cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt rename to cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 2c2aa86c..763b7e45 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,6 +1,8 @@ package ru.mipt.npm.root import kotlinx.serialization.json.* +import java.time.Duration +import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { val json = this@countTypes @@ -27,5 +29,9 @@ fun main() { println(it) } - val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + val time = measureTimeMillis { + val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + } + + println(Duration.ofMillis(time)) } \ No newline at end of file -- 2.34.1 From df30f8ecc3e1b2b1bc68d80cbacb027fda9ce64f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 25 Aug 2021 18:04:15 +0300 Subject: [PATCH 027/143] Add polygon and polycone and add generics to TObjectArray --- build.gradle.kts | 4 +- .../kotlin/ru/mipt/npm/root/JsonRootObject.kt | 26 --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 9 +- .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 49 ++--- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 2 +- .../kotlin/ru/mipt/npm/root/TObject.kt | 4 +- .../npm/root/{rootJson.kt => jsonToRoot.kt} | 106 +++++++---- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 176 ++++++++++++++++++ .../kotlin/ru/mipt/npm/root/loadBMN.kt | 1 + gradle.properties | 2 +- .../kscience/visionforge/solid/geometry.kt | 7 +- 12 files changed, 297 insertions(+), 97 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{rootJson.kt => jsonToRoot.kt} (71%) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt diff --git a/build.gradle.kts b/build.gradle.kts index cd6ece5d..20d1a1bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("ru.mipt.npm.gradle.project") -// kotlin("multiplatform") version "1.5.30-RC" apply false -// kotlin("js") version "1.5.30-RC" apply false + kotlin("multiplatform") version "1.5.30" apply false + kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.1") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt deleted file mode 100644 index bb5fd1cb..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt +++ /dev/null @@ -1,26 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.JsonElement - -@Serializable(JsonRootSerializer::class) -public class JsonRootObject(public val element: JsonElement): TObject() - -public object JsonRootSerializer: KSerializer{ - private val jsonElementSerializer = JsonElement.serializer() - - override val descriptor: SerialDescriptor - get() = jsonElementSerializer.descriptor - - override fun deserialize(decoder: Decoder): JsonRootObject { - return JsonRootObject(decoder.decodeSerializableValue(jsonElementSerializer)) - } - - override fun serialize(encoder: Encoder, value: JsonRootObject) { - encoder.encodeSerializableValue(jsonElementSerializer, value.element) - } -} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 96b02768..41607fbd 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -9,11 +9,14 @@ import kotlinx.serialization.Serializable public class TGeoManager : TNamed() { @Contextual - public val fMatrices: TObjArray = TObjArray.empty + public val fMatrices: TObjArray = TObjArray.getEmpty() @Contextual - public val fShapes: TObjArray = TObjArray.empty + public val fShapes: TObjArray = TObjArray.getEmpty() @Contextual - public val fVolumes: TObjArray = TObjArray.empty + public val fVolumes: TObjArray = TObjArray.getEmpty() + + @Contextual + public val fNodes: TObjArray = TObjArray.getEmpty() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 9e6f47f1..75a8ac05 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") -public open class TGeoNode : TNamed() { +public sealed class TGeoNode : TNamed() { public val fGeoAtt: UInt = 0u @Contextual @@ -25,4 +25,10 @@ public open class TGeoNode : TNamed() { public class TGeoNodeMatrix : TGeoNode() { @Contextual public val fMatrix: TGeoMatrix? = null +} + +@Serializable +@SerialName("TGeoNodeOffset") +public class TGeoNodeOffset : TGeoNode() { + public val fOffset: Double = 0.0 } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index 26cf0bab..7cf6876a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.root import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlin.math.PI @Serializable @SerialName("TGeoShape") @@ -27,13 +28,13 @@ public sealed class TGeoBoolNode : TObject() { public abstract val fLeft: TGeoShape @Contextual - public abstract val fLeftMat: TGeoMatrix + public val fLeftMat: TGeoMatrix? = null @Contextual public abstract val fRight: TGeoShape @Contextual - public abstract val fRightMat: TGeoMatrix + public val fRightMat: TGeoMatrix? = null } @Serializable @@ -42,11 +43,7 @@ public class TGeoUnion( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @@ -55,11 +52,7 @@ public class TGeoSubtraction( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @@ -68,11 +61,7 @@ public class TGeoIntersection( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @@ -97,18 +86,15 @@ public class TGeoXtru( @Serializable @SerialName("TGeoTube") -public open class TGeoTube( - public val fRmin: Double, - public val fRmax: Double, - public val fDz: Double, -) : TGeoBBox() +public open class TGeoTube : TGeoBBox() { + public val fRmin: Double = 0.0 + public val fRmax: Double = 0.0 + public val fDz: Double = 0.0 +} @Serializable @SerialName("TGeoTubeSeg") public class TGeoTubeSeg( - public val fRmin: Double, - public val fRmax: Double, - public val fDz: Double, public val fPhi1: Double, public val fPhi2: Double, public val fS1: Double, @@ -118,7 +104,24 @@ public class TGeoTubeSeg( public val fSm: Double, public val fCm: Double, public val fCdfi: Double, -) : TGeoBBox() +) : TGeoTube() + +@Serializable +@SerialName("TGeoPcon") +public open class TGeoPcon : TGeoBBox() { + public val fNz: Int = 0 // number of z planes (at least two) + public val fPhi1: Double = 0.0 // lower phi limit (converted to [0,2*pi) + public val fDphi: Double = PI * 2 // phi range + public val fRmin: DoubleArray = doubleArrayOf() //[fNz] pointer to array of inner radii + public val fRmax: DoubleArray = doubleArrayOf() //[fNz] pointer to array of outer radii + public val fZ: DoubleArray = doubleArrayOf() //[fNz] pointer to array of Z planes positions +} + +@Serializable +@SerialName("TGeoPgon") +public open class TGeoPgon : TGeoPcon() { + public val fNedges: Int = 0 +} @Serializable @SerialName("TGeoShapeAssembly") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index 480c1ca7..9823eb1f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -15,7 +15,7 @@ public open class TGeoVolume : TNamed() { public val fFillStyle: Int? = null @Contextual - public val fNodes: TObjArray? = null + public val fNodes: TObjArray? = null @Contextual public val fShape: TGeoShape? = null diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index 50738d11..063cadfe 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -19,9 +19,9 @@ public open class TNamed : TObject() { @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List<@Contextual TObject>): TObject() { +public class TObjArray(public val arr: List<@Contextual T>): TObject() { public companion object{ - public val empty: TObjArray = TObjArray(emptyList()) + public fun getEmpty(): TObjArray = TObjArray(emptyList()) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt similarity index 71% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index 8416368a..d0c3afb9 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -1,12 +1,27 @@ package ru.mipt.npm.root +import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.* +private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (JsonElement) -> T): DeserializationStrategy = object : + DeserializationStrategy { + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val json = decoder.decodeSerializableValue(jsonElementSerializer) + return builder(json) + } +} + /** * Load Json encoded TObject */ @@ -22,8 +37,7 @@ private object RootDecoder { private class RootUnrefSerializer( private val tSerializer: KSerializer, - private val refCache: List,// = ArrayList(4096) - //private val counter: ReferenceCounter + private val refCache: List, ) : KSerializer by tSerializer { override fun deserialize(decoder: Decoder): T { @@ -31,14 +45,14 @@ private object RootDecoder { val element = input.decodeJsonElement() val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int val ref = if (refId != null) { - //println("Substituting ref $refId") + //println("Substituting ${tSerializer.descriptor.serialName} ref $refId") //Forward ref for shapes when (tSerializer.descriptor.serialName) { - "TGeoShape" -> return TGeoShapeRef{ + "TGeoShape" -> return TGeoShapeRef { //Should be not null at the moment of actualization refCache[refId].value as TGeoShape } as T - "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef{ + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { //Should be not null at the moment of actualization refCache[refId].value as TGeoVolumeAssembly } as T @@ -66,24 +80,50 @@ private object RootDecoder { include(serializersModule) contextual(TGeoManager.serializer().unref(refCache)) - contextual(TObjArray.serializer().unref(refCache)) + contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } contextual(TGeoVolumeAssembly.serializer().unref(refCache)) contextual(TGeoShapeAssembly.serializer().unref(refCache)) contextual(TGeoRotation.serializer().unref(refCache)) contextual(TGeoMedium.serializer().unref(refCache)) contextual(TGeoVolume.serializer().unref(refCache)) contextual(TGeoMatrix.serializer().unref(refCache)) + contextual(TGeoNode.serializer().unref(refCache)) + contextual(TGeoNodeOffset.serializer().unref(refCache)) contextual(TGeoNodeMatrix.serializer().unref(refCache)) contextual(TGeoShape.serializer().unref(refCache)) contextual(TObject.serializer().unref(refCache)) polymorphicDefault(TGeoShape::class) { - TGeoShape.serializer().unref(refCache) + if (it == null) { + TGeoShape.serializer().unref(refCache) + } else { + error("Unrecognized shape $it") + } } polymorphicDefault(TGeoMatrix::class) { - TGeoMatrix.serializer().unref(refCache) + if (it == null) { + TGeoMatrix.serializer().unref(refCache) + } else { + error("Unrecognized matrix $it") + } + } + + polymorphicDefault(TGeoVolume::class) { + if (it == null) { + TGeoVolume.serializer().unref(refCache) + } else { + error("Unrecognized volume $it") + } + } + + polymorphicDefault(TGeoNode::class) { + if (it == null) { + TGeoNode.serializer().unref(refCache) + } else { + error("Unrecognized node $it") + } } } @@ -126,14 +166,6 @@ private object RootDecoder { return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) } -// class ReferenceCounter(var value: Int = 0) { -// fun increment() { -// value += 1 -// } -// -// override fun toString(): String = value.toString() -// } - class RefEntry(val element: JsonElement) { var value: Any? = null @@ -154,6 +186,8 @@ private object RootDecoder { subclass(TGeoXtru.serializer()) subclass(TGeoTube.serializer()) subclass(TGeoTubeSeg.serializer()) + subclass(TGeoPcon.serializer()) + subclass(TGeoPgon.serializer()) subclass(TGeoShapeAssembly.serializer()) } @@ -173,25 +207,24 @@ private object RootDecoder { private val serializersModule = SerializersModule { - polymorphic(TObject::class) { - default { JsonRootSerializer } - subclass(TObjArray.serializer()) - - shapes() - matrices() - boolNodes() - - subclass(TGeoMaterial.serializer()) - subclass(TGeoMixture.serializer()) - - subclass(TGeoMedium.serializer()) - - subclass(TGeoNode.serializer()) - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - subclass(TGeoManager.serializer()) - } +// polymorphic(TObject::class) { +// default { JsonRootSerializer } +// +// shapes() +// matrices() +// boolNodes() +// +// subclass(TGeoMaterial.serializer()) +// subclass(TGeoMixture.serializer()) +// +// subclass(TGeoMedium.serializer()) +// +// //subclass(TGeoNode.serializer()) +// subclass(TGeoNodeMatrix.serializer()) +// subclass(TGeoVolume.serializer()) +// subclass(TGeoVolumeAssembly.serializer()) +// subclass(TGeoManager.serializer()) +// } polymorphic(TGeoShape::class) { shapes() @@ -205,8 +238,9 @@ private object RootDecoder { boolNodes() } - polymorphic(TGeoNode::class, TGeoNode.serializer()) { + polymorphic(TGeoNode::class) { subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoNodeOffset.serializer()) } polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt new file mode 100644 index 00000000..ebfb7b06 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -0,0 +1,176 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.setPropertyNode +import space.kscience.visionforge.solid.* +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.pow +import kotlin.math.sqrt + + +private val solidsName = "solids".asName() +private val volumesName = "volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +private class GdmlLoader { + + // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) + } + + private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) + } + + private fun Solid.useMatrix(matrix: TGeoMatrix?) { + when (matrix) { + null, is TGeoIdentity -> { + //do nothing + } + is TGeoTranslation -> { + translate(matrix.fTranslation) + } + is TGeoRotation -> { + rotate(matrix.fRotationMatrix) + } + is TGeoCombiTrans -> { + translate(matrix.fTranslation) + matrix.fRotation?.let { rotate(it.fRotationMatrix) } + } + is TGeoHMatrix -> { + translate(matrix.fTranslation) + rotate(matrix.fRotationMatrix) + val (xScale, yScale, zScale) = matrix.fScale + scale = Point3D(xScale, yScale, zScale) + } + } + } + + fun SolidGroup.addShape(shape: TGeoShape) { + when (shape) { + is TGeoShapeRef -> addShape(shape.value) + is TGeoCompositeShape -> { + val bool: TGeoBoolNode = shape.fNode + val compositeType = when (bool) { + is TGeoIntersection -> CompositeType.INTERSECT + is TGeoSubtraction -> CompositeType.SUBTRACT + is TGeoUnion -> CompositeType.UNION + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft).apply { + useMatrix(bool.fLeftMat) + } + addShape(bool.fRight).apply { + useMatrix(bool.fRightMat) + } + } + } + is TGeoXtru -> extruded(name = shape.fName) { + + (0 until shape.fNvert).forEach { index -> + shape { + point(shape.fX[index], shape.fY[index]) + } + } + + (0 until shape.fNz).forEach { index -> + layer( + shape.fZ[index], + shape.fX0[index], + shape.fY0[index], + shape.fScale[index] + ) + } + } + is TGeoTube -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + name = shape.fName + ) + is TGeoTubeSeg -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + startAngle = degToRad(shape.fPhi1), + angle = degToRad(shape.fPhi2 - shape.fPhi1), + name = shape.fName + ) + is TGeoPcon -> TODO() + is TGeoPgon -> TODO() + is TGeoShapeAssembly -> volume(shape.fVolume) + is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } + } + + fun SolidGroup.node(obj: TGeoNode) { + if (obj.fVolume != null) { + volume(obj.fVolume).apply { + when (obj) { + is TGeoNodeMatrix -> { + useMatrix(obj.fMatrix) + } + is TGeoNodeOffset -> { + x = obj.fOffset + } + } + } + } + } + + fun buildGroup(volume: TGeoVolume): SolidGroup { + return if (volume is TGeoVolumeAssemblyRef) { + buildGroup(volume.value) + } else { + SolidGroup { + volume.fShape?.let { addShape(it) } + volume.fNodes?.let { + it.arr.forEach { obj -> + node(obj) + } + } + } + } + } + + private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + + fun SolidGroup.volume(volume: TGeoVolume): SolidGroup { + val group = buildGroup(volume) + val ref = rootPrototypes.prototypes { + + } + set(volume.fName.ifEmpty { null }?.asName(), group) + return group + } + + fun load(geo: TGeoManager): SolidGroup { + /** + * A special group for local templates + */ + val proto = SolidGroup() + + val solids = proto.group(solidsName) { + setPropertyNode("edges.enabled", false) + } + + val volumes = proto.group(volumesName) + + val referenceStore = HashMap>() + + TODO() + } + +} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 763b7e45..c6cec829 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -31,6 +31,7 @@ fun main() { val time = measureTimeMillis { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + println(geo) } println(Duration.ofMillis(time)) diff --git a/gradle.properties b/gradle.properties index 511d4130..5bce5b02 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false -kotlin.jupyter.add.scanner=false +#kotlin.jupyter.add.scanner=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index 31611dc9..ccff7dcd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -5,7 +5,10 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MetaProvider +import space.kscience.dataforge.meta.float +import space.kscience.dataforge.meta.get import space.kscience.visionforge.solid.Solid.Companion.X_KEY import space.kscience.visionforge.solid.Solid.Companion.Y_KEY import space.kscience.visionforge.solid.Solid.Companion.Z_KEY @@ -54,7 +57,7 @@ internal object Point3DSerializer : KSerializer { override val descriptor: SerialDescriptor = Point3DImpl.serializer().descriptor - override fun deserialize(decoder: Decoder): Point3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) + override fun deserialize(decoder: Decoder): MutablePoint3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) override fun serialize(encoder: Encoder, value: Point3D) { val impl: Point3DImpl = (value as? Point3DImpl) ?: Point3DImpl(value.x, value.y, value.z) -- 2.34.1 From 193665b99a30169d9aa208e94c6c551f9e7dcfa4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 25 Aug 2021 23:00:05 +0300 Subject: [PATCH 028/143] WIP Root to Solid conversion --- .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 16 +- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 268 +++++++++--------- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 4 +- .../visionforge/solid/SolidReference.kt | 23 +- .../visionforge/solid/SerializationTest.kt | 4 +- .../visionforge/solid/SolidReferenceTest.kt | 2 +- 6 files changed, 166 insertions(+), 151 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index d0c3afb9..585accf0 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -25,10 +25,10 @@ private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (Json /** * Load Json encoded TObject */ -public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): TObject = +public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = RootDecoder.decode(serializer, jsonElement) -public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): TObject { +public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): T { val json = RootDecoder.json.parseToJsonElement(string) return RootDecoder.decode(serializer, json) } @@ -49,12 +49,14 @@ private object RootDecoder { //Forward ref for shapes when (tSerializer.descriptor.serialName) { "TGeoShape" -> return TGeoShapeRef { - //Should be not null at the moment of actualization - refCache[refId].value as TGeoShape + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape + } } as T "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { - //Should be not null at the moment of actualization - refCache[refId].value as TGeoVolumeAssembly + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly + } } as T //Do unref else -> refCache[refId] @@ -138,7 +140,7 @@ private object RootDecoder { } - fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { + fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { val refCache = ArrayList() fun fillCache(element: JsonElement) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt index ebfb7b06..9cbbb64b 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -2,7 +2,7 @@ package ru.mipt.npm.root import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.setPropertyNode +import space.kscience.dataforge.names.plus import space.kscience.visionforge.solid.* import kotlin.math.PI import kotlin.math.atan2 @@ -19,158 +19,162 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class GdmlLoader { +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} - // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix - private fun Solid.rotate(rot: DoubleArray) { - val xAngle = atan2(-rot[5], rot[8]) - val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) - val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) - } +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} - private fun Solid.translate(trans: DoubleArray) { - val (x, y, z) = trans - position = Point3D(x, y, z) - } - - private fun Solid.useMatrix(matrix: TGeoMatrix?) { - when (matrix) { - null, is TGeoIdentity -> { - //do nothing - } - is TGeoTranslation -> { - translate(matrix.fTranslation) - } - is TGeoRotation -> { - rotate(matrix.fRotationMatrix) - } - is TGeoCombiTrans -> { - translate(matrix.fTranslation) - matrix.fRotation?.let { rotate(it.fRotationMatrix) } - } - is TGeoHMatrix -> { - translate(matrix.fTranslation) - rotate(matrix.fRotationMatrix) - val (xScale, yScale, zScale) = matrix.fScale - scale = Point3D(xScale, yScale, zScale) - } +private fun Solid.useMatrix(matrix: TGeoMatrix?) { + when (matrix) { + null, is TGeoIdentity -> { + //do nothing + } + is TGeoTranslation -> { + translate(matrix.fTranslation) + } + is TGeoRotation -> { + rotate(matrix.fRotationMatrix) + } + is TGeoCombiTrans -> { + translate(matrix.fTranslation) + matrix.fRotation?.let { rotate(it.fRotationMatrix) } + } + is TGeoHMatrix -> { + translate(matrix.fTranslation) + rotate(matrix.fRotationMatrix) + val (xScale, yScale, zScale) = matrix.fScale + scale = Point3D(xScale, yScale, zScale) } } +} - fun SolidGroup.addShape(shape: TGeoShape) { - when (shape) { - is TGeoShapeRef -> addShape(shape.value) - is TGeoCompositeShape -> { - val bool: TGeoBoolNode = shape.fNode - val compositeType = when (bool) { - is TGeoIntersection -> CompositeType.INTERSECT - is TGeoSubtraction -> CompositeType.SUBTRACT - is TGeoUnion -> CompositeType.UNION +private fun SolidGroup.addShape(shape: TGeoShape) { + when (shape) { + is TGeoShapeRef -> addShape(shape.value) + is TGeoCompositeShape -> { + val bool: TGeoBoolNode = shape.fNode + val compositeType = when (bool) { + is TGeoIntersection -> CompositeType.INTERSECT + is TGeoSubtraction -> CompositeType.SUBTRACT + is TGeoUnion -> CompositeType.UNION + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft).apply { + useMatrix(bool.fLeftMat) } - composite(compositeType, name = shape.fName) { - addShape(bool.fLeft).apply { - useMatrix(bool.fLeftMat) - } - addShape(bool.fRight).apply { - useMatrix(bool.fRightMat) - } + addShape(bool.fRight).apply { + useMatrix(bool.fRightMat) } } - is TGeoXtru -> extruded(name = shape.fName) { - - (0 until shape.fNvert).forEach { index -> - shape { - point(shape.fX[index], shape.fY[index]) - } - } - - (0 until shape.fNz).forEach { index -> - layer( - shape.fZ[index], - shape.fX0[index], - shape.fY0[index], - shape.fScale[index] - ) - } - } - is TGeoTube -> tube( - radius = shape.fRmax, - height = shape.fDz * 2, - innerRadius = shape.fRmin, - name = shape.fName - ) - is TGeoTubeSeg -> tube( - radius = shape.fRmax, - height = shape.fDz * 2, - innerRadius = shape.fRmin, - startAngle = degToRad(shape.fPhi1), - angle = degToRad(shape.fPhi2 - shape.fPhi1), - name = shape.fName - ) - is TGeoPcon -> TODO() - is TGeoPgon -> TODO() - is TGeoShapeAssembly -> volume(shape.fVolume) - is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) } - } + is TGeoXtru -> extruded(name = shape.fName) { - fun SolidGroup.node(obj: TGeoNode) { - if (obj.fVolume != null) { - volume(obj.fVolume).apply { - when (obj) { - is TGeoNodeMatrix -> { - useMatrix(obj.fMatrix) - } - is TGeoNodeOffset -> { - x = obj.fOffset - } + (0 until shape.fNvert).forEach { index -> + shape { + point(shape.fX[index], shape.fY[index]) + } + } + + (0 until shape.fNz).forEach { index -> + layer( + shape.fZ[index], + shape.fX0[index], + shape.fY0[index], + shape.fScale[index] + ) + } + } + is TGeoTube -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + name = shape.fName + ) + is TGeoTubeSeg -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + startAngle = degToRad(shape.fPhi1), + angle = degToRad(shape.fPhi2 - shape.fPhi1), + name = shape.fName + ) + is TGeoPcon -> TODO() + is TGeoPgon -> TODO() + is TGeoShapeAssembly -> volume(shape.fVolume) + is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } +} + +private fun SolidGroup.node(obj: TGeoNode) { + if (obj.fVolume != null) { + volume(obj.fVolume).apply { + when (obj) { + is TGeoNodeMatrix -> { + useMatrix(obj.fMatrix) + } + is TGeoNodeOffset -> { + x = obj.fOffset } } } } +} - fun buildGroup(volume: TGeoVolume): SolidGroup { - return if (volume is TGeoVolumeAssemblyRef) { - buildGroup(volume.value) - } else { - SolidGroup { - volume.fShape?.let { addShape(it) } - volume.fNodes?.let { - it.arr.forEach { obj -> - node(obj) - } +private fun buildGroup(volume: TGeoVolume): SolidGroup { + return if (volume is TGeoVolumeAssemblyRef) { + buildGroup(volume.value) + } else { + SolidGroup { + volume.fShape?.let { addShape(it) } + volume.fNodes?.let { + it.arr.forEach { obj -> + node(obj) } } } } +} - private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this +private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this - fun SolidGroup.volume(volume: TGeoVolume): SolidGroup { - val group = buildGroup(volume) - val ref = rootPrototypes.prototypes { +private fun SolidGroup.volume(volume: TGeoVolume, cache: Boolean = true): Solid { + val group = buildGroup(volume) + return if (!cache) { + group + } else newRef( + name = volume.fName.ifEmpty { null }, + obj = group, + prototypeHolder = rootPrototypes, + templateName = volumesName + Name.parse(volume.fName.ifEmpty { group.toString() }) + ) +} - } - set(volume.fName.ifEmpty { null }?.asName(), group) - return group +// private fun load(geo: TGeoManager): SolidGroup { +//// /** +//// * A special group for local templates +//// */ +//// val proto = SolidGroup() +//// +//// val solids = proto.group(solidsName) { +//// setPropertyNode("edges.enabled", false) +//// } +//// +//// val volumes = proto.group(volumesName) +//// +//// val referenceStore = HashMap>() +// } + + +public fun TGeoManager.toSolid(): SolidGroup = SolidGroup { + fNodes.arr.forEach { + node(it) } - - fun load(geo: TGeoManager): SolidGroup { - /** - * A special group for local templates - */ - val proto = SolidGroup() - - val solids = proto.group(solidsName) { - setPropertyNode("edges.enabled", false) - } - - val volumes = proto.group(volumesName) - - val referenceStore = HashMap>() - - TODO() - } - } \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index c6cec829..7d5f4b24 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -31,7 +31,9 @@ fun main() { val time = measureTimeMillis { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) - println(geo) + val solid = geo.toSolid() + + println(solid) } println(Duration.ofMillis(time)) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index d2080924..f58bcf8b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -158,21 +158,28 @@ public fun SolidGroup.ref( name: String? = null, ): SolidReferenceGroup = SolidReferenceGroup(templateName).also { set(name, it) } -/** - * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes - */ public fun SolidGroup.ref( - name: String, + templateName: String, + name: String? = null, +): SolidReferenceGroup = ref(Name.parse(templateName), name) + +/** + * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes. + * One must ensure that [prototypeHolder] is the owner of this group. + */ +public fun SolidGroup.newRef( + name: String?, obj: Solid, - templateName: Name = Name.parse(name), + prototypeHolder: PrototypeHolder = this, + templateName: Name = Name.parse(name ?: obj.toString()), ): SolidReferenceGroup { val existing = getPrototype(templateName) if (existing == null) { - prototypes { - this[templateName] = obj + prototypeHolder.prototypes { + set(templateName, obj) } } else if (existing != obj) { error("Can't add different prototype on top of existing one") } - return this@ref.ref(templateName, name) + return ref(templateName, name) } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 8f5c3f57..f8af54a0 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -16,7 +16,7 @@ fun SolidGroup.refGroup( block: MutableVisionGroup.() -> Unit ): SolidReferenceGroup { val group = SolidGroup().apply(block) - return ref(name, group, templateName) + return newRef(name, group, templateName = templateName) } @@ -42,7 +42,7 @@ class SerializationTest { z = -100 } val group = SolidGroup { - ref("cube", cube) + newRef("cube", cube) refGroup("pg", Name.parse("pg.content")) { sphere(50) { x = -100 diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index 2f8b7781..cfdd73f0 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -14,7 +14,7 @@ class SolidReferenceTest { val theStyle by style { SolidMaterial.MATERIAL_COLOR_KEY put "red" } - ref("test", Box(100f,100f,100f).apply { + newRef("test", Box(100f,100f,100f).apply { color("blue") useStyle(theStyle) }) -- 2.34.1 From 68704086e9564689433d2db4112a1d4514bcf3f1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 26 Aug 2021 09:52:35 +0300 Subject: [PATCH 029/143] WIP Root to Solid conversion --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 8 +++---- .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 23 ++++++++++--------- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 15 ++++++++---- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 6 ++--- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 41607fbd..8b2c3c26 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -9,14 +9,14 @@ import kotlinx.serialization.Serializable public class TGeoManager : TNamed() { @Contextual - public val fMatrices: TObjArray = TObjArray.getEmpty() + public val fMatrices: TObjArray<@Contextual TGeoMatrix> = TObjArray.getEmpty() @Contextual - public val fShapes: TObjArray = TObjArray.getEmpty() + public val fShapes: TObjArray<@Contextual TGeoShape> = TObjArray.getEmpty() @Contextual - public val fVolumes: TObjArray = TObjArray.getEmpty() + public val fVolumes: TObjArray<@Contextual TGeoVolume> = TObjArray.getEmpty() @Contextual - public val fNodes: TObjArray = TObjArray.getEmpty() + public val fNodes: TObjArray<@Contextual TGeoNode> = TObjArray.getEmpty() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index 585accf0..1b7fe798 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -81,19 +81,19 @@ private object RootDecoder { ): SerializersModule = SerializersModule { include(serializersModule) - contextual(TGeoManager.serializer().unref(refCache)) + //contextual(TGeoManager.serializer().unref(refCache)) contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } - contextual(TGeoVolumeAssembly.serializer().unref(refCache)) - contextual(TGeoShapeAssembly.serializer().unref(refCache)) + //contextual(TGeoVolumeAssembly.serializer().unref(refCache)) + //contextual(TGeoShapeAssembly.serializer().unref(refCache)) contextual(TGeoRotation.serializer().unref(refCache)) contextual(TGeoMedium.serializer().unref(refCache)) - contextual(TGeoVolume.serializer().unref(refCache)) - contextual(TGeoMatrix.serializer().unref(refCache)) - contextual(TGeoNode.serializer().unref(refCache)) - contextual(TGeoNodeOffset.serializer().unref(refCache)) - contextual(TGeoNodeMatrix.serializer().unref(refCache)) - contextual(TGeoShape.serializer().unref(refCache)) - contextual(TObject.serializer().unref(refCache)) + //contextual(TGeoVolume.serializer().unref(refCache)) + //contextual(TGeoMatrix.serializer().unref(refCache)) + //contextual(TGeoNode.serializer().unref(refCache)) + //contextual(TGeoNodeOffset.serializer().unref(refCache)) + //contextual(TGeoNodeMatrix.serializer().unref(refCache)) + //contextual(TGeoShape.serializer().unref(refCache)) + //contextual(TObject.serializer().unref(refCache)) polymorphicDefault(TGeoShape::class) { @@ -245,7 +245,8 @@ private object RootDecoder { subclass(TGeoNodeOffset.serializer()) } - polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + polymorphic(TGeoVolume::class) { + subclass(TGeoVolume.serializer()) subclass(TGeoVolumeAssembly.serializer()) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt index 9cbbb64b..ee14324d 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -115,7 +115,7 @@ private fun SolidGroup.addShape(shape: TGeoShape) { private fun SolidGroup.node(obj: TGeoNode) { if (obj.fVolume != null) { - volume(obj.fVolume).apply { + volume(obj.fVolume, obj.fName).apply { when (obj) { is TGeoNodeMatrix -> { useMatrix(obj.fMatrix) @@ -145,15 +145,22 @@ private fun buildGroup(volume: TGeoVolume): SolidGroup { private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this -private fun SolidGroup.volume(volume: TGeoVolume, cache: Boolean = true): Solid { +private fun SolidGroup.volume(volume: TGeoVolume, name: String? = null, cache: Boolean = true): Solid { val group = buildGroup(volume) + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } return if (!cache) { group } else newRef( - name = volume.fName.ifEmpty { null }, + name = combinedName, obj = group, prototypeHolder = rootPrototypes, - templateName = volumesName + Name.parse(volume.fName.ifEmpty { group.toString() }) + templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") ) } diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 7d5f4b24..7fcd1e22 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,12 +1,12 @@ package ru.mipt.npm.root import kotlinx.serialization.json.* +import space.kscience.visionforge.solid.Solids import java.time.Duration import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { - val json = this@countTypes - when (json){ + when (val json = this@countTypes){ is JsonObject -> { json["_typename"]?.let { yield(it.jsonPrimitive.content) } json.values.forEach { yieldAll(it.countTypes()) } @@ -33,7 +33,7 @@ fun main() { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) val solid = geo.toSolid() - println(solid) + println(Solids.encodeToString(solid)) } println(Duration.ofMillis(time)) -- 2.34.1 From 7b5faaa61e9ef77f196d0c1dd0ca7d6800fcd633 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 30 Aug 2021 12:58:41 +0300 Subject: [PATCH 030/143] dynamic root scheme parser --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 22 -- .../kotlin/ru/mipt/npm/root/TObjectScheme.kt | 140 ++++++++++ .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 261 ------------------ .../ru/mipt/npm/root/rootSchemeToSolid.kt | 217 +++++++++++++++ .../npm/root/serialization/TGeoManager.kt | 17 ++ .../root/{ => serialization}/TGeoMaterial.kt | 2 +- .../root/{ => serialization}/TGeoMatrix.kt | 2 +- .../root/{ => serialization}/TGeoMedium.kt | 2 +- .../npm/root/{ => serialization}/TGeoNode.kt | 4 +- .../npm/root/{ => serialization}/TGeoShape.kt | 2 +- .../root/{ => serialization}/TGeoVolume.kt | 4 +- .../npm/root/{ => serialization}/TObject.kt | 2 +- .../mipt/npm/root/serialization/jsonToRoot.kt | 235 ++++++++++++++++ .../root/{ => serialization}/rootToSolid.kt | 2 +- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 32 ++- gradle.properties | 2 - 16 files changed, 641 insertions(+), 305 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMaterial.kt (72%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMatrix.kt (94%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMedium.kt (85%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoNode.kt (89%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoShape.kt (98%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoVolume.kt (91%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TObject.kt (94%) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/rootToSolid.kt (99%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt deleted file mode 100644 index 8b2c3c26..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.Contextual -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -@SerialName("TGeoManager") -public class TGeoManager : TNamed() { - - @Contextual - public val fMatrices: TObjArray<@Contextual TGeoMatrix> = TObjArray.getEmpty() - - @Contextual - public val fShapes: TObjArray<@Contextual TGeoShape> = TObjArray.getEmpty() - - @Contextual - public val fVolumes: TObjArray<@Contextual TGeoVolume> = TObjArray.getEmpty() - - @Contextual - public val fNodes: TObjArray<@Contextual TGeoNode> = TObjArray.getEmpty() -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt new file mode 100644 index 00000000..0ec699bd --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt @@ -0,0 +1,140 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.json.Json +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import kotlin.properties.ReadOnlyProperty + +public typealias RefCache = List + +public interface ObjectRef { + public fun resolve(refCache: RefCache): T? +} + +private class ChildObjectRef( + val spec: Specification, + val metaProvider: () -> Meta? +) : ObjectRef { + override fun resolve(refCache: RefCache): T? { + val meta = metaProvider() ?: return null + meta["\$ref"]?.int?.let { refId -> + return spec.read(refCache[refId]) + } + return spec.read(meta) + } +} + +public fun List>.resolve(refCache: RefCache): List = map { it.resolve(refCache)!! } + + +public open class TObjectScheme : Scheme() { + + public val typename: String by string(key = "_typename".asName()) { error("Type is not defined") } + + internal fun tObjectArray( + spec: Specification + ): ReadOnlyProperty>> = ReadOnlyProperty { _, property -> + meta.getIndexed(Name.of(property.name, "arr")).values.map { ChildObjectRef(spec){it} } + } + + internal fun refSpec( + spec: Specification, + key: Name? = null + ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> + ChildObjectRef(spec) { meta[key ?: property.name.asName()] } + } + + public companion object : SchemeSpec(::TObjectScheme) +} + +public open class TNamedScheme : TObjectScheme() { + public val fName: String by string("") + public val fTitle: String by string("") + + public companion object : SchemeSpec(::TNamedScheme) +} + +public class TGeoMaterialScheme : TNamedScheme() { + + public companion object : SchemeSpec(::TGeoMaterialScheme) +} + +public class TGeoMediumScheme : TNamedScheme() { + public val fMaterial: ObjectRef by refSpec(TGeoMaterialScheme) + public val fParams: DoubleArray by doubleArray() + + public companion object : SchemeSpec(::TGeoMediumScheme) +} + +public class TGeoShapeScheme : TNamedScheme() { + public val fDX: Double by double(0.0) + public val fDY: Double by double(0.0) + public val fDZ: Double by double(0.0) + + public companion object : SchemeSpec(::TGeoShapeScheme) +} + +public class TGeoVolumeScheme : TNamedScheme() { + public val fNodes: List> by tObjectArray(TGeoNodeScheme) + public val fShape: ObjectRef by refSpec(TGeoShapeScheme) + public val fMedium: ObjectRef by refSpec(TGeoMediumScheme) + + public companion object : SchemeSpec(::TGeoVolumeScheme) +} + +public class TGeoNodeScheme : TNamedScheme() { + public val fVolume: ObjectRef by refSpec(TGeoVolumeScheme) + + public companion object : SchemeSpec(::TGeoNodeScheme) +} + +public class TGeoMatrixScheme : TNamedScheme() { + public companion object : SchemeSpec(::TGeoMatrixScheme) +} + + +public class TGeoBoolNodeScheme : TObjectScheme() { + public val fLeft: ObjectRef by refSpec(TGeoShapeScheme) + public val fLeftMat: ObjectRef by refSpec(TGeoMatrixScheme) + + public val fRight: ObjectRef by refSpec(TGeoShapeScheme) + public val fRightMat: ObjectRef by refSpec(TGeoMatrixScheme) + + public companion object : SchemeSpec(::TGeoBoolNodeScheme) +} + + +public class TGeoManagerScheme : TNamedScheme() { + public val fMatrices: List> by tObjectArray(TGeoMatrixScheme) + + public val fShapes: List> by tObjectArray(TGeoShapeScheme) + + public val fVolumes: List> by tObjectArray(TGeoVolumeScheme) + + public val fNodes: List> by tObjectArray(TGeoNodeScheme) + + public val refCache: List by lazy { + val res = ArrayList(4096) + fun fillCache(element: Meta) { + if(element["\$ref"] == null) { + res.add(element) + element.items.values.forEach { + if (!it.isLeaf) { + fillCache(it) + } + } + } + } + fillCache(meta) + res + } + + public companion object : SchemeSpec(::TGeoManagerScheme) { + + public fun parse(string: String): TGeoManagerScheme { + val meta = Json.decodeFromString(MetaSerializer, string) + return read(meta) + } + } +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt deleted file mode 100644 index 1b7fe798..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ /dev/null @@ -1,261 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.DeserializationStrategy -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.json.* -import kotlinx.serialization.modules.* - - -private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (JsonElement) -> T): DeserializationStrategy = object : - DeserializationStrategy { - private val jsonElementSerializer = JsonElement.serializer() - - override val descriptor: SerialDescriptor - get() = jsonElementSerializer.descriptor - - override fun deserialize(decoder: Decoder): T { - val json = decoder.decodeSerializableValue(jsonElementSerializer) - return builder(json) - } -} - -/** - * Load Json encoded TObject - */ -public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = - RootDecoder.decode(serializer, jsonElement) - -public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): T { - val json = RootDecoder.json.parseToJsonElement(string) - return RootDecoder.decode(serializer, json) -} - -private object RootDecoder { - - private class RootUnrefSerializer( - private val tSerializer: KSerializer, - private val refCache: List, - ) : KSerializer by tSerializer { - - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int - val ref = if (refId != null) { - //println("Substituting ${tSerializer.descriptor.serialName} ref $refId") - //Forward ref for shapes - when (tSerializer.descriptor.serialName) { - "TGeoShape" -> return TGeoShapeRef { - refCache[refId].getOrPutValue { - input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape - } - } as T - "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { - refCache[refId].getOrPutValue { - input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly - } - } as T - //Do unref - else -> refCache[refId] - } - } else { - refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") - } - - return ref.getOrPutValue { -// val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content - input.json.decodeFromJsonElement(tSerializer, it) - } - } - } - - private fun KSerializer.unref(refCache: List): KSerializer = - RootUnrefSerializer(this, refCache) - - @OptIn(ExperimentalSerializationApi::class) - fun unrefSerializersModule( - refCache: List - ): SerializersModule = SerializersModule { - include(serializersModule) - - //contextual(TGeoManager.serializer().unref(refCache)) - contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } - //contextual(TGeoVolumeAssembly.serializer().unref(refCache)) - //contextual(TGeoShapeAssembly.serializer().unref(refCache)) - contextual(TGeoRotation.serializer().unref(refCache)) - contextual(TGeoMedium.serializer().unref(refCache)) - //contextual(TGeoVolume.serializer().unref(refCache)) - //contextual(TGeoMatrix.serializer().unref(refCache)) - //contextual(TGeoNode.serializer().unref(refCache)) - //contextual(TGeoNodeOffset.serializer().unref(refCache)) - //contextual(TGeoNodeMatrix.serializer().unref(refCache)) - //contextual(TGeoShape.serializer().unref(refCache)) - //contextual(TObject.serializer().unref(refCache)) - - - polymorphicDefault(TGeoShape::class) { - if (it == null) { - TGeoShape.serializer().unref(refCache) - } else { - error("Unrecognized shape $it") - } - } - - polymorphicDefault(TGeoMatrix::class) { - if (it == null) { - TGeoMatrix.serializer().unref(refCache) - } else { - error("Unrecognized matrix $it") - } - } - - polymorphicDefault(TGeoVolume::class) { - if (it == null) { - TGeoVolume.serializer().unref(refCache) - } else { - error("Unrecognized volume $it") - } - } - - polymorphicDefault(TGeoNode::class) { - if (it == null) { - TGeoNode.serializer().unref(refCache) - } else { - error("Unrecognized node $it") - } - } - } - - /** - * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. - */ - private fun unrefJson(refCache: MutableList): Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = unrefSerializersModule(refCache) - } - - - fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { - val refCache = ArrayList() - - fun fillCache(element: JsonElement) { - when (element) { - is JsonObject -> { - if (element["_typename"] != null) { - refCache.add(RefEntry(element)) - } - element.values.forEach { - fillCache(it) - } - } - is JsonArray -> { - element.forEach { - fillCache(it) - } - } - else -> { - //ignore primitives - } - } - } - fillCache(source) - - return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) - } - - class RefEntry(val element: JsonElement) { - - var value: Any? = null - - fun getOrPutValue(builder: (JsonElement) -> T): T { - if (value == null) { - value = builder(element) - } - return value as T - } - - override fun toString(): String = element.toString() - } - - private fun PolymorphicModuleBuilder.shapes() { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoPcon.serializer()) - subclass(TGeoPgon.serializer()) - subclass(TGeoShapeAssembly.serializer()) - } - - private fun PolymorphicModuleBuilder.matrices() { - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - } - - private fun PolymorphicModuleBuilder.boolNodes() { - subclass(TGeoIntersection.serializer()) - subclass(TGeoUnion.serializer()) - subclass(TGeoSubtraction.serializer()) - } - - private val serializersModule = SerializersModule { - -// polymorphic(TObject::class) { -// default { JsonRootSerializer } -// -// shapes() -// matrices() -// boolNodes() -// -// subclass(TGeoMaterial.serializer()) -// subclass(TGeoMixture.serializer()) -// -// subclass(TGeoMedium.serializer()) -// -// //subclass(TGeoNode.serializer()) -// subclass(TGeoNodeMatrix.serializer()) -// subclass(TGeoVolume.serializer()) -// subclass(TGeoVolumeAssembly.serializer()) -// subclass(TGeoManager.serializer()) -// } - - polymorphic(TGeoShape::class) { - shapes() - } - - polymorphic(TGeoMatrix::class) { - matrices() - } - - polymorphic(TGeoBoolNode::class) { - boolNodes() - } - - polymorphic(TGeoNode::class) { - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoNodeOffset.serializer()) - } - - polymorphic(TGeoVolume::class) { - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - } - } - - val json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = this@RootDecoder.serializersModule - } - -} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt new file mode 100644 index 00000000..89849613 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt @@ -0,0 +1,217 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.solid.* +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.pow +import kotlin.math.sqrt + +private val solidsName = "solids".asName() +private val volumesName = "volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} + +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} + +private fun Solid.useMatrix(matrix: TGeoMatrixScheme?) { + if (matrix == null) return + when (matrix.typename) { + "TGeoIdentity" -> { + //do nothing + } + "TGeoTranslation" -> { + val fTranslation by matrix.doubleArray() + translate(fTranslation) + } + "TGeoRotation" -> { + val fRotationMatrix by matrix.doubleArray() + rotate(fRotationMatrix) + } + "TGeoCombiTrans" -> { + val fTranslation by matrix.doubleArray() + + translate(fTranslation) + if (matrix.meta["fRotationMatrix"] != null) { + val fRotationMatrix by matrix.doubleArray() + rotate(fRotationMatrix) + } + } + "TGeoHMatrix" -> { + val fTranslation by matrix.doubleArray() + val fRotationMatrix by matrix.doubleArray() + val fScale by matrix.doubleArray() + translate(fTranslation) + rotate(fRotationMatrix) + scale = Point3D(fScale[0], fScale[1], fScale[2]) + } + } +} + +private fun SolidGroup.addShape(shape: TGeoShapeScheme, refCache: RefCache) { + when (shape.typename) { + "TGeoCompositeShape" -> { + val bool by shape.spec(TGeoBoolNodeScheme) + val compositeType = when (bool.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.UNION + else -> error("Unknown bool node type ${bool.typename}") + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft.resolve(refCache)!!, refCache).apply { + useMatrix(bool.fLeftMat.resolve(refCache)) + } + addShape(bool.fRight.resolve(refCache)!!, refCache).apply { + useMatrix(bool.fRightMat.resolve(refCache)) + } + } + } + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() + + extruded(name = shape.fName) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } + + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + } + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = shape.fName + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + startAngle = degToRad(fPhi1), + angle = degToRad(fPhi2 - fPhi1), + name = shape.fName + ) + } + "TGeoPcon" -> { + TODO() + } + "TGeoPgon" -> { + TODO() + } + "TGeoShapeAssembly" -> { + val fVolume by shape.refSpec(TGeoVolumeScheme) + volume(fVolume.resolve(refCache)!!, refCache) + } + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } + } +} + +private fun SolidGroup.node(obj: TGeoNodeScheme, refCache: RefCache) { + val volume = obj.fVolume.resolve(refCache) + if (volume != null) { + volume(volume, refCache, obj.fName).apply { + when (obj.typename) { + "TGeoNodeMatrix" -> { + val fMatrix by obj.refSpec(TGeoMatrixScheme) + useMatrix(fMatrix.resolve(refCache)) + } + "TGeoNodeOffset" -> { + val fOffset by obj.meta.double(0.0) + x = fOffset + } + } + } + } +} + +private fun buildGroup(volume: TGeoVolumeScheme, refCache: RefCache): SolidGroup = SolidGroup { + volume.fShape.resolve(refCache)?.let { addShape(it, refCache) } + volume.fNodes.let { + it.forEach { obj -> + node(obj.resolve(refCache)!!, refCache) + } + } +} + +private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + +private fun SolidGroup.volume( + volume: TGeoVolumeScheme, + refCache: RefCache, + name: String? = null, + cache: Boolean = true +): Solid { + val group = buildGroup(volume, refCache) + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } + return if (!cache) { + set(combinedName?.let { Name.parse(it)},group) + group + } else newRef( + name = combinedName, + obj = group, + prototypeHolder = rootPrototypes, + templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") + ) +} + +public fun TGeoManagerScheme.toSolid(): SolidGroup = SolidGroup { + fNodes.forEach { + node(it.resolve(refCache)!!, refCache) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt new file mode 100644 index 00000000..59957364 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt @@ -0,0 +1,17 @@ +package ru.mipt.npm.root.serialization + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("TGeoManager") +public class TGeoManager : TNamed() { + + public val fMatrices: TObjArray = TObjArray.getEmpty() + + public val fShapes: TObjArray = TObjArray.getEmpty() + + public val fVolumes: TObjArray = TObjArray.getEmpty() + + public val fNodes: TObjArray = TObjArray.getEmpty() +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt similarity index 72% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt index f4883e0e..e13d30b4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt similarity index 94% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt index 0c6ec7ab..63ee38a7 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt similarity index 85% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt index 72b72c4c..630826e8 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt similarity index 89% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt index 75a8ac05..1babbbfc 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") -public sealed class TGeoNode : TNamed() { +public open class TGeoNode : TNamed() { public val fGeoAtt: UInt = 0u @Contextual diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt similarity index 98% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt index 7cf6876a..faf47121 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt similarity index 91% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt index 9823eb1f..77c99e54 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName @@ -15,7 +15,7 @@ public open class TGeoVolume : TNamed() { public val fFillStyle: Int? = null @Contextual - public val fNodes: TObjArray? = null + public val fNodes: TObjArray<@Contextual TGeoNode>? = null @Contextual public val fShape: TGeoShape? = null diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt similarity index 94% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt index 063cadfe..644c05a4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt new file mode 100644 index 00000000..94079ccd --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -0,0 +1,235 @@ +package ru.mipt.npm.root.serialization + +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + + +private fun jsonRootDeserializer( + tSerializer: KSerializer, + builder: (JsonElement) -> T +): DeserializationStrategy = object : + DeserializationStrategy { + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val json = decoder.decodeSerializableValue(jsonElementSerializer) + return builder(json) + } +} + +/** + * Load Json encoded TObject + */ +public fun TObject.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = + RootDecoder.decode(serializer, jsonElement) + +public fun TObject.decodeFromString(serializer: KSerializer, string: String): T { + val json = Json.parseToJsonElement(string) + return RootDecoder.decode(serializer, json) +} + +private object RootDecoder { + + private class RootUnrefSerializer( + private val tSerializer: KSerializer, + private val refCache: List, + ) : KSerializer by tSerializer { + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + val ref = if (refId != null) { + println("Substituting ${tSerializer.descriptor.serialName} ref $refId") + //Forward ref for shapes + when (tSerializer.descriptor.serialName) { + "TGeoShape" -> return TGeoShapeRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape + } + } as T + + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly + } + } as T + + "TGeoVolume" -> return TGeoVolumeRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolume + } + } as T + + //Do unref + else -> refCache[refId] + } + } else { + refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") + } + + return ref.getOrPutValue { +// println("Decoding $it") + val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content + input.json.decodeFromJsonElement(tSerializer, it) + } + } + } + + private fun KSerializer.unref(refCache: List): KSerializer = RootUnrefSerializer(this, refCache) + + @OptIn(ExperimentalSerializationApi::class) + fun unrefSerializersModule( + refCache: List + ): SerializersModule = SerializersModule { + + contextual(TObjArray::class) { + TObjArray.serializer(it[0]).unref(refCache) + } + + contextual(TGeoMedium.serializer().unref(refCache)) + + polymorphic(TGeoBoolNode::class) { + subclass(TGeoIntersection.serializer().unref(refCache)) + subclass(TGeoUnion.serializer().unref(refCache)) + subclass(TGeoSubtraction.serializer().unref(refCache)) + } + + polymorphic(TGeoShape::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoPcon.serializer()) + subclass(TGeoPgon.serializer()) + + subclass(TGeoCompositeShape.serializer().unref(refCache)) + subclass(TGeoShapeAssembly.serializer().unref(refCache)) + + default { + if (it == null) { + TGeoShape.serializer().unref(refCache) + } else { + error("Unrecognized shape $it") + } + } + } + + polymorphic(TGeoMatrix::class) { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer().unref(refCache)) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer().unref(refCache)) + + + val unrefed = TGeoMatrix.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized matrix $it") + } + } + } + + polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + + val unrefed = TGeoVolume.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized volume $it") + } + } + } + + polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + subclass(TGeoNodeOffset.serializer().unref(refCache)) + + val unrefed = TGeoNode.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized node $it") + } + } + } + } + + /** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ + private fun unrefJson(refCache: MutableList): Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = unrefSerializersModule(refCache) + } + + + fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { + val refCache = ArrayList() + + fun fillCache(element: JsonElement) { + when (element) { + is JsonObject -> { + if (element["_typename"] != null) { + refCache.add(RefEntry(element)) + } + element.values.forEach { + fillCache(it) + } + } + is JsonArray -> { + element.forEach { + fillCache(it) + } + } + else -> { + //ignore primitives + } + } + } + fillCache(source) + + return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) + } + + class RefEntry(val element: JsonElement) { + + var value: Any? = null + + fun getOrPutValue(builder: (JsonElement) -> T): T { + if (value == null) { + value = builder(element) + } + return value as T + } + + override fun toString(): String = element.toString() + } + +// val json = Json { +// encodeDefaults = true +// ignoreUnknownKeys = true +// classDiscriminator = "_typename" +// serializersModule = this@RootDecoder.serializersModule +// } + +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt similarity index 99% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt index ee14324d..117e51b3 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 7fcd1e22..fbd7482e 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,12 +1,16 @@ package ru.mipt.npm.root -import kotlinx.serialization.json.* +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonPrimitive +import ru.mipt.npm.root.serialization.TGeoManager import space.kscience.visionforge.solid.Solids import java.time.Duration import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { - when (val json = this@countTypes){ + when (val json = this@countTypes) { is JsonObject -> { json["_typename"]?.let { yield(it.jsonPrimitive.content) } json.values.forEach { yieldAll(it.countTypes()) } @@ -16,25 +20,33 @@ private fun JsonElement.countTypes(): Sequence = sequence { yieldAll(it.countTypes()) } } - else -> {} + else -> { + } } } fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() - val json = Json.parseToJsonElement(string) - val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } - sizes.forEach { - println(it) - } - val time = measureTimeMillis { - val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + val geo = TGeoManagerScheme.parse(string) val solid = geo.toSolid() println(Solids.encodeToString(solid)) } +// val json = Json.parseToJsonElement(string) +// val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } +// sizes.forEach { +// println(it) +// } +// +// val time = measureTimeMillis { +// val geo = TObject.decodeFromString(TGeoManager.serializer(), string) +// val solid = geo.toSolid() +// +// println(Solids.encodeToString(solid)) +// } +// println(Duration.ofMillis(time)) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5bce5b02..0ed8858a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,5 @@ kotlin.code.style=official -kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true -kotlin.native.enableDependencyPropagation=false #kotlin.jupyter.add.scanner=false -- 2.34.1 From e25c1bd49b26046ff049a40b13a3f096fcc0c38b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 18:37:16 +0300 Subject: [PATCH 031/143] Finished Root converter --- .../kotlin/ru/mipt/npm/root/DObject.kt | 160 ++++++++++ .../kotlin/ru/mipt/npm/root/TObjectScheme.kt | 140 --------- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 280 ++++++++++++++++++ .../ru/mipt/npm/root/rootSchemeToSolid.kt | 217 -------------- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 24 +- .../kscience/visionforge/solid/Composite.kt | 5 +- .../visionforge/solid/SolidReference.kt | 2 +- 7 files changed, 466 insertions(+), 362 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt new file mode 100644 index 00000000..361e0ae2 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -0,0 +1,160 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.json.Json +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.values.doubleArray +import kotlin.properties.ReadOnlyProperty + +public fun MetaProvider.doubleArray( + vararg default: Double, + key: Name? = null, +): ReadOnlyProperty = value(key) { + it?.doubleArray ?: doubleArrayOf(*default) +} + + +public class DObjectCache(private val cache: List, public val refStack: List = emptyList()) { + public operator fun get(index: Int): Meta = cache[index] + + public fun stack(ref: Int): DObjectCache = DObjectCache(cache, refStack + ref) + + public companion object { + public val empty: DObjectCache = DObjectCache(emptyList(), emptyList()) + } +} +// +//public interface ObjectRef { +// public fun resolve(): T? +//} + +//public class ChildObjectRef( +// public val builder: (Meta, DObjectCache) -> T, +// public val refCache: DObjectCache, +// public val metaProvider: () -> Meta? +//) : ObjectRef { +// override fun resolve(): T? { +// val meta = metaProvider() ?: return null +// meta["\$ref"]?.int?.let { refId -> +// if (refCache.refStack.contains(refId)) { +// println("Circular reference $refId in stack ${refCache.refStack}") +// return null +// } +// return builder(refCache[refId], refCache.stack(refId)) +// } +// return builder(meta, refCache) +// } +//} + +public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { + + public val typename: String by meta.string(key = "_typename".asName()) { + error("Type is not defined") + } + + private fun resolve(builder: (Meta, DObjectCache) -> T, meta: Meta): T? { + meta["\$ref"]?.int?.let { refId -> + if (refCache.refStack.contains(refId)) { + println("Circular reference $refId in stack ${refCache.refStack}") + return null + } + return builder(refCache[refId], refCache.stack(refId)) + } + return builder(meta, refCache) + } + + internal fun tObjectArray( + builder: (Meta, DObjectCache) -> T + ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> + meta.getIndexed(Name.of(property.name, "arr")).values.mapNotNull { + resolve(builder, it) + } + } + + internal fun dObject( + builder: (Meta, DObjectCache) -> T, + key: Name? = null + ): ReadOnlyProperty = ReadOnlyProperty { _, property -> + meta[key ?: property.name.asName()]?.let { resolve(builder, it) } + } +} + +public open class DNamed(meta: Meta, refCache: DObjectCache) : DObject(meta, refCache) { + public val fName: String by meta.string("") + public val fTitle: String by meta.string("") +} + +public class DGeoMaterial(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +} + +public class DGeoMedium(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fMaterial: DGeoMaterial? by dObject(::DGeoMaterial) + public val fParams: DoubleArray by meta.doubleArray() +} + +public class DGeoShape(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fDX: Double by meta.double(0.0) + public val fDY: Double by meta.double(0.0) + public val fDZ: Double by meta.double(0.0) +} + +public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache), Named { + public val fNodes: List by tObjectArray(::DGeoNode) + public val fShape: DGeoShape? by dObject(::DGeoShape) + public val fMedium: DGeoMedium? by dObject(::DGeoMedium) + + override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } +} + +public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fVolume: DGeoVolume? by dObject(::DGeoVolume) +} + +public class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +} + + +public class DGeoBoolNode(meta: Meta, refCache: DObjectCache) : DObject(meta, refCache) { + public val fLeft: DGeoShape? by dObject(::DGeoShape) + public val fLeftMat: DGeoMatrix? by dObject(::DGeoMatrix) + + public val fRight: DGeoShape? by dObject(::DGeoShape) + public val fRightMat: DGeoMatrix? by dObject(::DGeoMatrix) +} + + +public class DGeoManager(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fMatrices: List by tObjectArray(::DGeoMatrix) + + public val fShapes: List by tObjectArray(::DGeoShape) + + public val fVolumes: List by tObjectArray(::DGeoVolume) + + public val fNodes: List by tObjectArray(::DGeoNode) + + public companion object { + + public fun parse(string: String): DGeoManager { + val meta = Json.decodeFromString(MetaSerializer, string) + val res = ArrayList(4096) + + fun fillCache(element: Meta) { + if (element["\$ref"] == null) { + res.add(element) + element.items.values.forEach { + if (!it.isLeaf) { + fillCache(it) + } + } + } + } + + fillCache(meta) + + val refCache = DObjectCache(res) + return DGeoManager(meta, refCache) + } + } +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt deleted file mode 100644 index 0ec699bd..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt +++ /dev/null @@ -1,140 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.json.Json -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import kotlin.properties.ReadOnlyProperty - -public typealias RefCache = List - -public interface ObjectRef { - public fun resolve(refCache: RefCache): T? -} - -private class ChildObjectRef( - val spec: Specification, - val metaProvider: () -> Meta? -) : ObjectRef { - override fun resolve(refCache: RefCache): T? { - val meta = metaProvider() ?: return null - meta["\$ref"]?.int?.let { refId -> - return spec.read(refCache[refId]) - } - return spec.read(meta) - } -} - -public fun List>.resolve(refCache: RefCache): List = map { it.resolve(refCache)!! } - - -public open class TObjectScheme : Scheme() { - - public val typename: String by string(key = "_typename".asName()) { error("Type is not defined") } - - internal fun tObjectArray( - spec: Specification - ): ReadOnlyProperty>> = ReadOnlyProperty { _, property -> - meta.getIndexed(Name.of(property.name, "arr")).values.map { ChildObjectRef(spec){it} } - } - - internal fun refSpec( - spec: Specification, - key: Name? = null - ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> - ChildObjectRef(spec) { meta[key ?: property.name.asName()] } - } - - public companion object : SchemeSpec(::TObjectScheme) -} - -public open class TNamedScheme : TObjectScheme() { - public val fName: String by string("") - public val fTitle: String by string("") - - public companion object : SchemeSpec(::TNamedScheme) -} - -public class TGeoMaterialScheme : TNamedScheme() { - - public companion object : SchemeSpec(::TGeoMaterialScheme) -} - -public class TGeoMediumScheme : TNamedScheme() { - public val fMaterial: ObjectRef by refSpec(TGeoMaterialScheme) - public val fParams: DoubleArray by doubleArray() - - public companion object : SchemeSpec(::TGeoMediumScheme) -} - -public class TGeoShapeScheme : TNamedScheme() { - public val fDX: Double by double(0.0) - public val fDY: Double by double(0.0) - public val fDZ: Double by double(0.0) - - public companion object : SchemeSpec(::TGeoShapeScheme) -} - -public class TGeoVolumeScheme : TNamedScheme() { - public val fNodes: List> by tObjectArray(TGeoNodeScheme) - public val fShape: ObjectRef by refSpec(TGeoShapeScheme) - public val fMedium: ObjectRef by refSpec(TGeoMediumScheme) - - public companion object : SchemeSpec(::TGeoVolumeScheme) -} - -public class TGeoNodeScheme : TNamedScheme() { - public val fVolume: ObjectRef by refSpec(TGeoVolumeScheme) - - public companion object : SchemeSpec(::TGeoNodeScheme) -} - -public class TGeoMatrixScheme : TNamedScheme() { - public companion object : SchemeSpec(::TGeoMatrixScheme) -} - - -public class TGeoBoolNodeScheme : TObjectScheme() { - public val fLeft: ObjectRef by refSpec(TGeoShapeScheme) - public val fLeftMat: ObjectRef by refSpec(TGeoMatrixScheme) - - public val fRight: ObjectRef by refSpec(TGeoShapeScheme) - public val fRightMat: ObjectRef by refSpec(TGeoMatrixScheme) - - public companion object : SchemeSpec(::TGeoBoolNodeScheme) -} - - -public class TGeoManagerScheme : TNamedScheme() { - public val fMatrices: List> by tObjectArray(TGeoMatrixScheme) - - public val fShapes: List> by tObjectArray(TGeoShapeScheme) - - public val fVolumes: List> by tObjectArray(TGeoVolumeScheme) - - public val fNodes: List> by tObjectArray(TGeoNodeScheme) - - public val refCache: List by lazy { - val res = ArrayList(4096) - fun fillCache(element: Meta) { - if(element["\$ref"] == null) { - res.add(element) - element.items.values.forEach { - if (!it.isLeaf) { - fillCache(it) - } - } - } - } - fillCache(meta) - res - } - - public companion object : SchemeSpec(::TGeoManagerScheme) { - - public fun parse(string: String): TGeoManagerScheme { - val meta = Json.decodeFromString(MetaSerializer, string) - return read(meta) - } - } -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt new file mode 100644 index 00000000..87422b97 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -0,0 +1,280 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.solid.* +import kotlin.math.* + +private val volumesName = Name.EMPTY //"volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +private class RootToSolidContext(val prototypeHolder: PrototypeHolder) + +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} + +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} + +private fun Solid.useMatrix(matrix: DGeoMatrix?) { + if (matrix == null) return + when (matrix.typename) { + "TGeoIdentity" -> { + //do nothing + } + "TGeoTranslation" -> { + val fTranslation by matrix.meta.doubleArray() + translate(fTranslation) + } + "TGeoRotation" -> { + val fRotationMatrix by matrix.meta.doubleArray() + rotate(fRotationMatrix) + } + "TGeoCombiTrans" -> { + val fTranslation by matrix.meta.doubleArray() + + translate(fTranslation) + if (matrix.meta["fRotationMatrix"] != null) { + val fRotationMatrix by matrix.meta.doubleArray() + rotate(fRotationMatrix) + } + } + "TGeoHMatrix" -> { + val fTranslation by matrix.meta.doubleArray() + val fRotationMatrix by matrix.meta.doubleArray() + val fScale by matrix.meta.doubleArray() + translate(fTranslation) + rotate(fRotationMatrix) + scale = Point3D(fScale[0], fScale[1], fScale[2]) + } + } +} + +private fun SolidGroup.addShape( + shape: DGeoShape, + context: RootToSolidContext, + name: String? = shape.fName.ifEmpty { null } +): Solid? = when (shape.typename) { + "TGeoCompositeShape" -> { + val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) + val node = fNode ?: error("Composite shape node not resolved") + val compositeType = when (node.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.UNION + else -> error("Unknown bool node type ${node.typename}") + } + composite(compositeType, name = name) { + addShape(node.fLeft!!, context, "left").also { + if (it == null) TODO() + it.useMatrix(node.fLeftMat) + } + addShape(node.fRight!!, context, "right").also { + if (it == null) TODO() + it.useMatrix(node.fRightMat) + } + } + } + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() + + extruded(name = name) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } + + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + } + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = name + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + startAngle = degToRad(fPhi1), + angle = degToRad(fPhi2 - fPhi1), + name = name + ) + } + "TGeoPcon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + if (fNz == 2) { + coneSurface( + bottomOuterRadius = fRmax[0], + bottomInnerRadius = fRmin[0], + height = fZ[1] - fZ[0], + topOuterRadius = fRmax[1], + topInnerRadius = fRmin[1], + startAngle = degToRad(fPhi1), + angle = degToRad(fDphi), + name = name + ) { + z = (fZ[1] + fZ[0]) / 2 + } + } else { + TODO() + } + } + "TGeoPgon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + + val fNedges by shape.meta.int(1) + + val startphi = degToRad(fPhi1) + val deltaphi = degToRad(fDphi) + + extruded(name) { + //getting the radius of first + require(fNz > 1) { "The polyhedron geometry requires at least two planes" } + val baseRadius = fRmax[0] + shape { + (0..fNedges).forEach { + val phi = deltaphi * fNedges * it + startphi + (baseRadius * cos(phi) to baseRadius * sin(phi)) + } + } + (0 until fNz).forEach { index -> + //scaling all radii relative to first layer radius + layer(fZ[index], scale = fRmax[index] / baseRadius) + } + } + } + "TGeoShapeAssembly" -> { + val fVolume by shape.dObject(::DGeoVolume) + fVolume?.let { volume -> + addRootVolume(volume, context) + } + } + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name) + } + else -> { + TODO("A shape with type ${shape.typename} not implemented") + } +} + +private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { + val volume = obj.fVolume ?: return + addRootVolume(volume, context, obj.fName).apply { + when (obj.typename) { + "TGeoNodeMatrix" -> { + val fMatrix by obj.dObject(::DGeoMatrix) + useMatrix(fMatrix) + } + "TGeoNodeOffset" -> { + val fOffset by obj.meta.double(0.0) + x = fOffset + } + } + } +} + +private fun buildGroup(volume: DGeoVolume, context: RootToSolidContext): SolidGroup = SolidGroup { + volume.fShape?.let { + addShape(it, context) + } + volume.fNodes.let { + it.forEach { node -> + addRootNode(node, context) + } + } +} + +//private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + +private fun SolidGroup.addRootVolume( + volume: DGeoVolume, + context: RootToSolidContext, + name: String? = null, + cache: Boolean = true +): Solid { + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } + + return if (!cache) { + val group = buildGroup(volume, context) + set(combinedName?.let { Name.parse(it) }, group) + group + } else { + val templateName = volumesName + volume.name + val existing = getPrototype(templateName) + if (existing == null) { + context.prototypeHolder.prototypes { + set(templateName, buildGroup(volume, context)) + } + } + + return ref(templateName, name) + } +} + +public fun DGeoManager.toSolid(): SolidGroup = SolidGroup { + val context = RootToSolidContext(this) + fNodes.forEach { node -> + addRootNode(node, context) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt deleted file mode 100644 index 89849613..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt +++ /dev/null @@ -1,217 +0,0 @@ -package ru.mipt.npm.root - -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.plus -import space.kscience.visionforge.solid.* -import kotlin.math.PI -import kotlin.math.atan2 -import kotlin.math.pow -import kotlin.math.sqrt - -private val solidsName = "solids".asName() -private val volumesName = "volumes".asName() - -private operator fun Number.times(d: Double) = toDouble() * d - -private operator fun Number.times(f: Float) = toFloat() * f - -private fun degToRad(d: Double) = d * PI / 180.0 - -// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix -private fun Solid.rotate(rot: DoubleArray) { - val xAngle = atan2(-rot[5], rot[8]) - val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) - val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) -} - -private fun Solid.translate(trans: DoubleArray) { - val (x, y, z) = trans - position = Point3D(x, y, z) -} - -private fun Solid.useMatrix(matrix: TGeoMatrixScheme?) { - if (matrix == null) return - when (matrix.typename) { - "TGeoIdentity" -> { - //do nothing - } - "TGeoTranslation" -> { - val fTranslation by matrix.doubleArray() - translate(fTranslation) - } - "TGeoRotation" -> { - val fRotationMatrix by matrix.doubleArray() - rotate(fRotationMatrix) - } - "TGeoCombiTrans" -> { - val fTranslation by matrix.doubleArray() - - translate(fTranslation) - if (matrix.meta["fRotationMatrix"] != null) { - val fRotationMatrix by matrix.doubleArray() - rotate(fRotationMatrix) - } - } - "TGeoHMatrix" -> { - val fTranslation by matrix.doubleArray() - val fRotationMatrix by matrix.doubleArray() - val fScale by matrix.doubleArray() - translate(fTranslation) - rotate(fRotationMatrix) - scale = Point3D(fScale[0], fScale[1], fScale[2]) - } - } -} - -private fun SolidGroup.addShape(shape: TGeoShapeScheme, refCache: RefCache) { - when (shape.typename) { - "TGeoCompositeShape" -> { - val bool by shape.spec(TGeoBoolNodeScheme) - val compositeType = when (bool.typename) { - "TGeoIntersection" -> CompositeType.INTERSECT - "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.UNION - else -> error("Unknown bool node type ${bool.typename}") - } - composite(compositeType, name = shape.fName) { - addShape(bool.fLeft.resolve(refCache)!!, refCache).apply { - useMatrix(bool.fLeftMat.resolve(refCache)) - } - addShape(bool.fRight.resolve(refCache)!!, refCache).apply { - useMatrix(bool.fRightMat.resolve(refCache)) - } - } - } - "TGeoXtru" -> { - val fNvert by shape.meta.int(0) - val fX by shape.meta.doubleArray() - val fY by shape.meta.doubleArray() - val fNz by shape.meta.int(0) - val fZ by shape.meta.doubleArray() - val fX0 by shape.meta.doubleArray() - val fY0 by shape.meta.doubleArray() - val fScale by shape.meta.doubleArray() - - extruded(name = shape.fName) { - (0 until fNvert).forEach { index -> - shape { - point(fX[index], fY[index]) - } - } - - (0 until fNz).forEach { index -> - layer( - fZ[index], - fX0[index], - fY0[index], - fScale[index] - ) - } - } - } - "TGeoTube" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - name = shape.fName - ) - } - "TGeoTubeSeg" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - val fPhi1 by shape.meta.double(0.0) - val fPhi2 by shape.meta.double(0.0) - - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - startAngle = degToRad(fPhi1), - angle = degToRad(fPhi2 - fPhi1), - name = shape.fName - ) - } - "TGeoPcon" -> { - TODO() - } - "TGeoPgon" -> { - TODO() - } - "TGeoShapeAssembly" -> { - val fVolume by shape.refSpec(TGeoVolumeScheme) - volume(fVolume.resolve(refCache)!!, refCache) - } - "TGeoBBox" -> { - box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) - } - } -} - -private fun SolidGroup.node(obj: TGeoNodeScheme, refCache: RefCache) { - val volume = obj.fVolume.resolve(refCache) - if (volume != null) { - volume(volume, refCache, obj.fName).apply { - when (obj.typename) { - "TGeoNodeMatrix" -> { - val fMatrix by obj.refSpec(TGeoMatrixScheme) - useMatrix(fMatrix.resolve(refCache)) - } - "TGeoNodeOffset" -> { - val fOffset by obj.meta.double(0.0) - x = fOffset - } - } - } - } -} - -private fun buildGroup(volume: TGeoVolumeScheme, refCache: RefCache): SolidGroup = SolidGroup { - volume.fShape.resolve(refCache)?.let { addShape(it, refCache) } - volume.fNodes.let { - it.forEach { obj -> - node(obj.resolve(refCache)!!, refCache) - } - } -} - -private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this - -private fun SolidGroup.volume( - volume: TGeoVolumeScheme, - refCache: RefCache, - name: String? = null, - cache: Boolean = true -): Solid { - val group = buildGroup(volume, refCache) - val combinedName = if (volume.fName.isEmpty()) { - name - } else if (name == null) { - volume.fName - } else { - "${name}_${volume.fName}" - } - return if (!cache) { - set(combinedName?.let { Name.parse(it)},group) - group - } else newRef( - name = combinedName, - obj = group, - prototypeHolder = rootPrototypes, - templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") - ) -} - -public fun TGeoManagerScheme.toSolid(): SolidGroup = SolidGroup { - fNodes.forEach { - node(it.resolve(refCache)!!, refCache) - } -} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index fbd7482e..fdbcea6d 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -5,8 +5,14 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonPrimitive import ru.mipt.npm.root.serialization.TGeoManager +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isLeaf +import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids +import java.nio.file.Paths import java.time.Duration +import kotlin.io.path.writeText import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { @@ -25,14 +31,28 @@ private fun JsonElement.countTypes(): Sequence = sequence { } } +private fun Meta.countTypes() :Sequence = sequence { + if(!isLeaf){ + get("_typename")?.value?.let { yield(it.string) } + items.forEach { yieldAll(it.value.countTypes()) } + } +} + fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() val time = measureTimeMillis { - val geo = TGeoManagerScheme.parse(string) + val geo = DGeoManager.parse(string) + + val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + val solid = geo.toSolid() - println(Solids.encodeToString(solid)) + Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + //println(Solids.encodeToString(solid)) } // val json = Json.parseToJsonElement(string) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 9debf612..00db285c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.update import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set public enum class CompositeType { @@ -20,7 +21,7 @@ public class Composite( public val compositeType: CompositeType, public val first: Solid, public val second: Solid, -) : SolidBase(), Solid +) : SolidBase(), VisionPropertyContainer @VisionBuilder public inline fun VisionContainerBuilder.composite( @@ -30,7 +31,7 @@ public inline fun VisionContainerBuilder.composite( ): Composite { val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() - if (children.size != 2) error("Composite requires exactly two children") + if (children.size != 2) error("Composite requires exactly two children, but found ${children.size}") val res = Composite(type, children[0], children[1]) res.meta.update(group.meta) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index f58bcf8b..eeab05ff 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -165,7 +165,7 @@ public fun SolidGroup.ref( /** * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes. - * One must ensure that [prototypeHolder] is the owner of this group. + * One must ensure that [prototypeHolder] is a parent of this group. */ public fun SolidGroup.newRef( name: String?, -- 2.34.1 From 0ee14aa90e58a12f32a77e51c0f436525516bfa9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 18:58:55 +0300 Subject: [PATCH 032/143] Minor fix to solid signatures --- .../kotlin/space/kscience/visionforge/solid/ConeSurface.kt | 3 ++- .../kotlin/space/kscience/visionforge/solid/Convex.kt | 3 ++- .../kotlin/space/kscience/visionforge/solid/PolyLine.kt | 7 ++----- .../kotlin/space/kscience/visionforge/solid/SolidLabel.kt | 3 ++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index a9c5622b..25f79ee8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set import kotlin.math.PI import kotlin.math.cos @@ -23,7 +24,7 @@ public class ConeSurface( public val topInnerRadius: Float, public val startAngle: Float = 0f, public val angle: Float = PI2, -) : SolidBase(), GeometrySolid { +) : SolidBase(), GeometrySolid, VisionPropertyContainer { init { require(bottomRadius > 0) { "Cone surface bottom radius must be positive" } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt index 2d242391..24d1ff16 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt @@ -3,11 +3,12 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set @Serializable @SerialName("solid.convex") -public class Convex(public val points: List) : SolidBase(), Solid +public class Convex(public val points: List) : SolidBase(), VisionPropertyContainer public inline fun VisionContainerBuilder.convex(name: String? = null, action: ConvexBuilder.() -> Unit = {}): Convex = ConvexBuilder().apply(action).build().also { set(name, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index d8aa937c..05d58744 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -5,14 +5,11 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.numberProperty -import space.kscience.visionforge.set +import space.kscience.visionforge.* @Serializable @SerialName("solid.line") -public class PolyLine(public val points: List) : SolidBase(), Solid { +public class PolyLine(public val points: List) : SolidBase(), VisionPropertyContainer { //var lineType by string() public var thickness: Number by numberProperty(name = SolidMaterial.MATERIAL_KEY + THICKNESS_KEY) { 1.0 } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt index 3e725d0d..8cf27881 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set @Serializable @@ -12,7 +13,7 @@ public class SolidLabel( public val text: String, public val fontSize: Double, public val fontFamily: String, -) : SolidBase(), Solid +) : SolidBase(), VisionPropertyContainer @VisionBuilder public fun VisionContainerBuilder.label( -- 2.34.1 From aea4eb7d45ae6ae39219a0fdec82c0419e295571 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 22:59:12 +0300 Subject: [PATCH 033/143] Hot fix for circular top volume reference --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 25 +++++++++++++------ .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 1 - gradle.properties | 1 + .../kscience/visionforge/VisionGroupBase.kt | 2 +- .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +++ .../kscience/visionforge/solid/Solids.kt | 1 + 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 87422b97..582389e2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.root import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.visionforge.solid.* @@ -228,15 +229,23 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { } } -private fun buildGroup(volume: DGeoVolume, context: RootToSolidContext): SolidGroup = SolidGroup { - volume.fShape?.let { - addShape(it, context) - } - volume.fNodes.let { - it.forEach { node -> +private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid { + val group = SolidGroup { + if(volume.fNodes.isEmpty()) { + //TODO add smart filter + volume.fShape?.let { shape -> + addShape(shape, context) + } + } + volume.fNodes.forEach { node -> addRootNode(node, context) } } + return if (group.children.size == 1 && group.meta.isEmpty()) { + (group.children.values.first() as Solid).apply { parent = null } + } else { + group + } } //private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this @@ -256,7 +265,7 @@ private fun SolidGroup.addRootVolume( } return if (!cache) { - val group = buildGroup(volume, context) + val group = buildVolume(volume, context) set(combinedName?.let { Name.parse(it) }, group) group } else { @@ -264,7 +273,7 @@ private fun SolidGroup.addRootVolume( val existing = getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - set(templateName, buildGroup(volume, context)) + set(templateName, buildVolume(volume, context)) } } diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index f2371f44..83e750ba 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -21,7 +21,6 @@ class GDMLDemoApp : App(GDMLView::class) class GDMLView : View() { private val context = Context { plugin(FX3DPlugin) - plugin(VisionManager) } private val fx3d = context.fetch(FX3DPlugin) diff --git a/gradle.properties b/gradle.properties index 0ed8858a..24f28924 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true #kotlin.jupyter.add.scanner=false +kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index 7280ae1f..d4af712d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -76,7 +76,7 @@ public open class VisionGroupBase( * Set parent for given child and attach it */ private fun attachChild(token: NameToken, child: Vision?) { - val before = children[token] + val before = childrenInternal[token] when { child == null -> { childrenInternal.remove(token) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 9aed5d50..48f99ac1 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -27,6 +27,8 @@ import kotlin.reflect.KClass public class FX3DPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag + public val solids: Solids by require(Solids) + private val objectFactories = HashMap, FX3DFactory<*>>() private val compositeFactory = FXCompositeFactory(this) private val referenceFactory = FXReferenceFactory(this) @@ -50,6 +52,7 @@ public class FX3DPlugin : AbstractPlugin() { is SolidGroup -> { Group(obj.children.mapNotNull { (token, obj) -> (obj as? Solid)?.let { + logger.info { token.toString() } buildNode(it).apply { properties["name"] = token.toString() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index ca83f00f..c5b9b04b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -18,6 +18,7 @@ import kotlin.reflect.KClass public class Solids(meta: Meta) : VisionPlugin(meta) { override val tag: PluginTag get() = Companion.tag + override val visionSerializersModule: SerializersModule get() = serializersModuleForSolids public companion object : PluginFactory { -- 2.34.1 From 2e3b63c0f464fac2c7213726efa453c272409f5e Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 6 Sep 2021 22:48:03 +0300 Subject: [PATCH 034/143] Composite Union is replaced by a Group. Colors for root --- .../kotlin/ru/mipt/npm/root/DObject.kt | 2 + .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 26 +++-- .../kotlin/ru/mipt/npm/root/rootColor.kt | 42 +++++++ .../kotlin/ru/mipt/npm/root/loadBMN.kt | 72 ------------ demo/playground/build.gradle.kts | 1 + .../src/jvmMain/kotlin/rootParser.kt | 104 ++++++++++++++++++ .../jvmMain/resources/root}/BM@N.root.json | 0 .../visionforge/solid/FXCompositeFactory.kt | 2 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 4 +- .../kscience/visionforge/solid/Composite.kt | 28 ++++- .../kscience/visionforge/solid/SolidGroup.kt | 4 +- visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 22 ++-- .../solid/three/ThreeCompositeFactory.kt | 5 +- 14 files changed, 207 insertions(+), 107 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt delete mode 100644 cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt create mode 100644 demo/playground/src/jvmMain/kotlin/rootParser.kt rename {cern-root-loader/src/commonTest/resources => demo/playground/src/jvmMain/resources/root}/BM@N.root.json (100%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 361e0ae2..e0933614 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -105,6 +105,8 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fShape: DGeoShape? by dObject(::DGeoShape) public val fMedium: DGeoMedium? by dObject(::DGeoMedium) + public val fFillColor: Int? by meta.int() + override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 582389e2..0fa40340 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,12 +1,11 @@ package ru.mipt.npm.root -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.isEmpty +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.doubleArray import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* private val volumesName = Name.EMPTY //"volumes".asName() @@ -50,9 +49,8 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { val fTranslation by matrix.meta.doubleArray() translate(fTranslation) - if (matrix.meta["fRotationMatrix"] != null) { - val fRotationMatrix by matrix.meta.doubleArray() - rotate(fRotationMatrix) + matrix.meta["fRotation.fRotationMatrix"]?.value?.let { + rotate(it.doubleArray) } } "TGeoHMatrix" -> { @@ -77,15 +75,15 @@ private fun SolidGroup.addShape( val compositeType = when (node.typename) { "TGeoIntersection" -> CompositeType.INTERSECT "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.UNION + "TGeoUnion" -> CompositeType.GROUP else -> error("Unknown bool node type ${node.typename}") } - composite(compositeType, name = name) { - addShape(node.fLeft!!, context, "left").also { + smartComposite(compositeType, name = name) { + addShape(node.fLeft!!, context, null).also { if (it == null) TODO() it.useMatrix(node.fLeftMat) } - addShape(node.fRight!!, context, "right").also { + addShape(node.fRight!!, context, null).also { if (it == null) TODO() it.useMatrix(node.fRightMat) } @@ -277,7 +275,11 @@ private fun SolidGroup.addRootVolume( } } - return ref(templateName, name) + ref(templateName, name) + }.apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt new file mode 100644 index 00000000..9ea9c040 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt @@ -0,0 +1,42 @@ +package ru.mipt.npm.root + +public object RootColors { + private val colorMap = Array(924) { "white" } + + //colorMap[110] = "white" + + private val moreCol = listOf( + 11 to "c1b7ad4d4d4d6666668080809a9a9ab3b3b3cdcdcde6e6e6f3f3f3cdc8accdc8acc3c0a9bbb6a4b3a697b8a49cae9a8d9c8f83886657b1cfc885c3a48aa9a1839f8daebdc87b8f9a768a926983976e7b857d9ad280809caca6c0d4cf88dfbb88bd9f83c89a7dc08378cf5f61ac8f94a6787b946971d45a549300ff7b00ff6300ff4b00ff3300ff1b00ff0300ff0014ff002cff0044ff005cff0074ff008cff00a4ff00bcff00d4ff00ecff00fffd00ffe500ffcd00ffb500ff9d00ff8500ff6d00ff5500ff3d00ff2600ff0e0aff0022ff003aff0052ff006aff0082ff009aff00b1ff00c9ff00e1ff00f9ff00ffef00ffd700ffbf00ffa700ff8f00ff7700ff6000ff4800ff3000ff1800ff0000", + 201 to "5c5c5c7b7b7bb8b8b8d7d7d78a0f0fb81414ec4848f176760f8a0f14b81448ec4876f1760f0f8a1414b84848ec7676f18a8a0fb8b814ecec48f1f1768a0f8ab814b8ec48ecf176f10f8a8a14b8b848ecec76f1f1", + 390 to "ffffcdffff9acdcd9affff66cdcd669a9a66ffff33cdcd339a9a33666633ffff00cdcd009a9a00666600333300", + 406 to "cdffcd9aff9a9acd9a66ff6666cd66669a6633ff3333cd33339a3333663300ff0000cd00009a00006600003300", + 422 to "cdffff9affff9acdcd66ffff66cdcd669a9a33ffff33cdcd339a9a33666600ffff00cdcd009a9a006666003333", + 590 to "cdcdff9a9aff9a9acd6666ff6666cd66669a3333ff3333cd33339a3333660000ff0000cd00009a000066000033", + 606 to "ffcdffff9affcd9acdff66ffcd66cd9a669aff33ffcd33cd9a339a663366ff00ffcd00cd9a009a660066330033", + 622 to "ffcdcdff9a9acd9a9aff6666cd66669a6666ff3333cd33339a3333663333ff0000cd00009a0000660000330000", + 791 to "ffcd9acd9a669a66339a6600cd9a33ffcd66ff9a00ffcd33cd9a00ffcd00ff9a33cd66006633009a3300cd6633ff9a66ff6600ff6633cd3300ff33009aff3366cd00336600339a0066cd339aff6666ff0066ff3333cd0033ff00cdff9a9acd66669a33669a009acd33cdff669aff00cdff339acd00cdff009affcd66cd9a339a66009a6633cd9a66ffcd00ff6633ffcd00cd9a00ffcd33ff9a00cd66006633009a3333cd6666ff9a00ff9a33ff6600cd3300ff339acdff669acd33669a00339a3366cd669aff0066ff3366ff0033cd0033ff339aff0066cd00336600669a339acd66cdff009aff33cdff009acd00cdffcd9aff9a66cd66339a66009a9a33cdcd66ff9a00ffcd33ff9a00cdcd00ff9a33ff6600cd33006633009a6633cd9a66ff6600ff6633ff3300cd3300ffff339acd00666600339a0033cd3366ff669aff0066ff3366cd0033ff0033ff9acdcd669a9a33669a0066cd339aff66cdff009acd009aff33cdff009a", + 920 to "cdcdcd9a9a9a666666333333" + ) + + init { + colorMap[0] = "white" + colorMap[1] = "black" + colorMap[2] = "red" + colorMap[3] = "green" + colorMap[4] = "blue" + colorMap[5] = "yellow" + colorMap[6] = "magenta" + colorMap[7] = "cyan" + colorMap[8] = "rgb(89,212,84)" + colorMap[9] = "rgb(89,84,217)" + colorMap[10] = "white" + + moreCol.forEach { (n, s) -> + for (i in 0 until (s.length / 6)) { + colorMap[n + i] = "#" + s.substring(i * 6, (i + 1) * 6) + } + } + } + + public operator fun get(index: Int): String = colorMap[index] +} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt deleted file mode 100644 index fdbcea6d..00000000 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ /dev/null @@ -1,72 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.jsonPrimitive -import ru.mipt.npm.root.serialization.TGeoManager -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.isLeaf -import space.kscience.dataforge.values.string -import space.kscience.visionforge.solid.Solids -import java.nio.file.Paths -import java.time.Duration -import kotlin.io.path.writeText -import kotlin.system.measureTimeMillis - -private fun JsonElement.countTypes(): Sequence = sequence { - when (val json = this@countTypes) { - is JsonObject -> { - json["_typename"]?.let { yield(it.jsonPrimitive.content) } - json.values.forEach { yieldAll(it.countTypes()) } - } - is JsonArray -> { - json.forEach { - yieldAll(it.countTypes()) - } - } - else -> { - } - } -} - -private fun Meta.countTypes() :Sequence = sequence { - if(!isLeaf){ - get("_typename")?.value?.let { yield(it.string) } - items.forEach { yieldAll(it.value.countTypes()) } - } -} - -fun main() { - val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! - .readAllBytes().decodeToString() - val time = measureTimeMillis { - val geo = DGeoManager.parse(string) - - val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } - sizes.forEach { - println(it) - } - - val solid = geo.toSolid() - - Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) - //println(Solids.encodeToString(solid)) - } - -// val json = Json.parseToJsonElement(string) -// val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } -// sizes.forEach { -// println(it) -// } -// -// val time = measureTimeMillis { -// val geo = TObject.decodeFromString(TGeoManager.serializer(), string) -// val solid = geo.toSolid() -// -// println(Solids.encodeToString(solid)) -// } -// - println(Duration.ofMillis(time)) -} \ No newline at end of file diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 515cb165..f06c209e 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -55,6 +55,7 @@ kotlin { api(project(":visionforge-gdml")) api(project(":visionforge-plotly")) api(projects.visionforge.visionforgeMarkdown) + api(projects.visionforge.cernRootLoader) } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt new file mode 100644 index 00000000..e8995009 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -0,0 +1,104 @@ +package space.kscience.visionforge.examples + +import ru.mipt.npm.root.DGeoManager +import ru.mipt.npm.root.serialization.TGeoManager +import ru.mipt.npm.root.toSolid +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isLeaf +import space.kscience.dataforge.values.string +import space.kscience.visionforge.solid.Solids + + +private fun Meta.countTypes(): Sequence = sequence { + if (!isLeaf) { + get("_typename")?.value?.let { yield(it.string) } + items.forEach { yieldAll(it.value.countTypes()) } + } +} + +fun main() { + val context = Context { + plugin(Solids) + } + + val string = TGeoManager::class.java.getResourceAsStream("/root/BM@N.root.json")!! + .readAllBytes().decodeToString() + + val geo = DGeoManager.parse(string) + + + val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + + + val solid = geo.toSolid() + + //Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + //println(Solids.encodeToString(solid)) + + context.makeVisionFile { + vision("canvas") { + solid +/* SolidGroup { + set( + "Coil", + solid.getPrototype("Coil".asName())!!.apply { + parent = null + } + ) + *//* group("Shade") { + y = 200 + color("red") + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(79.6, 0, -122.1) + rotation = Point3D(-1.5707964, 0, 0) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(-79.6, 0, -122.1) + rotation = Point3D(1.5707964, 0, -3.1415927) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(79.6, 0, 122.1) + rotation = Point3D(1.5707964, 0, 0) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(-79.6, 0, 122.1) + rotation = Point3D(-1.5707964, 0, -3.1415927) + } + }*//* + }*/ + } + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonTest/resources/BM@N.root.json b/demo/playground/src/jvmMain/resources/root/BM@N.root.json similarity index 100% rename from cern-root-loader/src/commonTest/resources/BM@N.root.json rename to demo/playground/src/jvmMain/resources/root/BM@N.root.json diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt index 1cdcf914..588f15cf 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt @@ -48,7 +48,7 @@ public class FXCompositeFactory(public val plugin: FX3DPlugin) : FX3DFactory firstCSG.union(secondCSG) + CompositeType.GROUP, CompositeType.UNION -> firstCSG.union(secondCSG) CompositeType.INTERSECT -> firstCSG.intersect(secondCSG) CompositeType.SUBTRACT -> firstCSG.difference(secondCSG) } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 8eca342c..8d5ebd49 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -215,12 +215,12 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val first: GdmlSolid = solid.first.resolve(root) ?: error("") val second: GdmlSolid = solid.second.resolve(root) ?: error("") val type: CompositeType = when (solid) { - is GdmlUnion -> CompositeType.SUM // dumb sum for better performance + is GdmlUnion -> CompositeType.GROUP // dumb sum for better performance is GdmlSubtraction -> CompositeType.SUBTRACT is GdmlIntersection -> CompositeType.INTERSECT } - return composite(type, name) { + return smartComposite(type, name) { addSolid(root, first).withPosition( solid.resolveFirstPosition(root), solid.resolveFirstRotation(root), diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 00db285c..a68ff645 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.meta.update import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder @@ -9,7 +10,7 @@ import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set public enum class CompositeType { - SUM, // Dumb sum of meshes + GROUP, // Dumb sum of meshes UNION, //CSG union INTERSECT, SUBTRACT @@ -50,6 +51,31 @@ public inline fun VisionContainerBuilder.composite( return res } +/** + * A smart form of [Composite] that in case of [CompositeType.GROUP] creates a static group instead + */ +@VisionBuilder +public fun SolidGroup.smartComposite( + type: CompositeType, + name: String? = null, + builder: SolidGroup.() -> Unit, +): Solid = if (type == CompositeType.GROUP) { + val group = SolidGroup(builder) + if (name == null && group.meta.isEmpty()) { + //append directly to group if no properties are defined + group.children.forEach { (key, value) -> + value.parent = null + set(null, value) + } + this + } else { + set(name, group) + group + } +} else { + composite(type, name, builder) +} + @VisionBuilder public inline fun VisionContainerBuilder.union( name: String? = null, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index ec6dd5f1..604aac01 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -82,8 +82,8 @@ public fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup { @VisionBuilder public fun VisionContainerBuilder.group( name: Name? = null, - action: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup().apply(action).also { set(name, it) } + builder: SolidGroup.() -> Unit = {}, +): SolidGroup = SolidGroup().apply(builder).also { set(name, it) } /** * Define a group with given [name], attach it to this parent and return it. diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index a6407d13..37b8772f 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -5,5 +5,5 @@ plugins { dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.130.1")) - implementation(npm("three-csg-ts", "3.1.6")) + implementation(npm("three-csg-ts", "3.1.9")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 3b5ae6ae..d715a20f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -167,7 +167,7 @@ public class ThreeCanvas( } //Clipping planes - options.useProperty(Canvas3DOptions::clipping){clipping -> + options.useProperty(Canvas3DOptions::clipping) { clipping -> if (!clipping.meta.isEmpty()) { renderer.localClippingEnabled = true boundingBox?.let { boundingBox -> @@ -192,7 +192,7 @@ public class ThreeCanvas( } } - options.useProperty(Canvas3DOptions::size){ + options.useProperty(Canvas3DOptions::size) { canvas.style.apply { minWidth = "${options.size.minWith.toInt()}px" maxWidth = "${options.size.maxWith.toInt()}px" @@ -273,18 +273,14 @@ public class ThreeCanvas( return } if (this is Mesh) { - if (highlight) { - val edges = LineSegments( - EdgesGeometry(geometry), - material - ).apply { - name = edgesName - } - add(edges) - } else { - val highlightEdges = children.find { it.name == edgesName } - highlightEdges?.let { remove(it) } + val edges = getObjectByName(edgesName) ?: LineSegments( + EdgesGeometry(geometry), + material + ).also { + it.name = edgesName + add(it) } + edges.visible = highlight } else { children.filter { it.name != edgesName }.forEach { it.toggleHighlight(highlight, edgesName, material) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 5705459a..f57530b3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid.three import CSG -import info.laht.threekt.core.Object3D import info.laht.threekt.objects.Mesh import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange @@ -38,11 +37,11 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class - override fun invoke(three: ThreePlugin, obj: Composite): Object3D { + override fun invoke(three: ThreePlugin, obj: Composite): Mesh { val first = three.buildObject3D(obj.first) as? Mesh ?: error("First part of composite is not a mesh") val second = three.buildObject3D(obj.second) as? Mesh ?: error("Second part of composite is not a mesh") return when (obj.compositeType) { - CompositeType.SUM, CompositeType.UNION -> CSG.union(first, second) + CompositeType.GROUP, CompositeType.UNION -> CSG.union(first, second) CompositeType.INTERSECT -> CSG.intersect(first, second) CompositeType.SUBTRACT -> CSG.subtract(first, second) }.apply { -- 2.34.1 From bdbe9402721e4b0fe49ac27472b1b558ebde56a0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 14:26:21 +0300 Subject: [PATCH 035/143] Fixed issues with root importer --- build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/DObject.kt | 23 -- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 326 ++++++++++-------- demo/muon-monitor/build.gradle.kts | 6 - .../src/jvmMain/kotlin/rootParser.kt | 13 +- gradle.properties | 2 +- .../kscience/visionforge/react/VisionTree.kt | 2 +- .../space/kscience/visionforge/VisionGroup.kt | 2 +- .../kscience/visionforge/html/headers.kt | 4 +- .../kscience/visionforge/solid/Hexagon.kt | 4 +- 10 files changed, 200 insertions(+), 184 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 20d1a1bd..1984e3d3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-23" + version = "0.2.0-dev-24" } subprojects { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index e0933614..712e1a4e 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -15,7 +15,6 @@ public fun MetaProvider.doubleArray( it?.doubleArray ?: doubleArrayOf(*default) } - public class DObjectCache(private val cache: List, public val refStack: List = emptyList()) { public operator fun get(index: Int): Meta = cache[index] @@ -25,28 +24,6 @@ public class DObjectCache(private val cache: List, public val refStack: Li public val empty: DObjectCache = DObjectCache(emptyList(), emptyList()) } } -// -//public interface ObjectRef { -// public fun resolve(): T? -//} - -//public class ChildObjectRef( -// public val builder: (Meta, DObjectCache) -> T, -// public val refCache: DObjectCache, -// public val metaProvider: () -> Meta? -//) : ObjectRef { -// override fun resolve(): T? { -// val meta = metaProvider() ?: return null -// meta["\$ref"]?.int?.let { refId -> -// if (refCache.refStack.contains(refId)) { -// println("Circular reference $refId in stack ${refCache.refStack}") -// return null -// } -// return builder(refCache[refId], refCache.stack(refId)) -// } -// return builder(meta, refCache) -// } -//} public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 0fa40340..ed0b76fd 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -4,6 +4,7 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.doubleArray +import space.kscience.visionforge.isEmpty import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* @@ -16,7 +17,16 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class RootToSolidContext(val prototypeHolder: PrototypeHolder) +private class RootToSolidContext(val prototypeHolder: PrototypeHolder, val maxLayer: Int = 3) { + val layers: MutableList = mutableListOf(0) + + val layerLimits = listOf(10_000, 25_000, 50_000, 100_000, 200_000, 400_000, 600_000) + + val bottomLayer: Int get() = layers.size - 1 + fun addLayer() { + layers.add(0) + } +} // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix private fun Solid.rotate(rot: DoubleArray) { @@ -67,157 +77,164 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { private fun SolidGroup.addShape( shape: DGeoShape, context: RootToSolidContext, - name: String? = shape.fName.ifEmpty { null } -): Solid? = when (shape.typename) { - "TGeoCompositeShape" -> { - val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) - val node = fNode ?: error("Composite shape node not resolved") - val compositeType = when (node.typename) { - "TGeoIntersection" -> CompositeType.INTERSECT - "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.GROUP - else -> error("Unknown bool node type ${node.typename}") - } - smartComposite(compositeType, name = name) { - addShape(node.fLeft!!, context, null).also { - if (it == null) TODO() - it.useMatrix(node.fLeftMat) + name: String? = shape.fName.ifEmpty { null }, + block: Solid.() -> Unit = {} +) { + when (shape.typename) { + "TGeoCompositeShape" -> { + val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) + val node = fNode ?: error("Composite shape node not resolved") + val compositeType = when (node.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.GROUP + else -> error("Unknown bool node type ${node.typename}") } - addShape(node.fRight!!, context, null).also { - if (it == null) TODO() - it.useMatrix(node.fRightMat) - } - } - } - "TGeoXtru" -> { - val fNvert by shape.meta.int(0) - val fX by shape.meta.doubleArray() - val fY by shape.meta.doubleArray() - val fNz by shape.meta.int(0) - val fZ by shape.meta.doubleArray() - val fX0 by shape.meta.doubleArray() - val fY0 by shape.meta.doubleArray() - val fScale by shape.meta.doubleArray() - - extruded(name = name) { - (0 until fNvert).forEach { index -> - shape { - point(fX[index], fY[index]) + smartComposite(compositeType, name = name) { + addShape(node.fLeft!!, context, null) { + this.useMatrix(node.fLeftMat) } - } - - (0 until fNz).forEach { index -> - layer( - fZ[index], - fX0[index], - fY0[index], - fScale[index] - ) - } + addShape(node.fRight!!, context, null) { + this.useMatrix(node.fRightMat) + } + }.apply(block) } - } - "TGeoTube" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - name = name - ) - } - "TGeoTubeSeg" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - val fPhi1 by shape.meta.double(0.0) - val fPhi2 by shape.meta.double(0.0) + extruded(name = name) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - startAngle = degToRad(fPhi1), - angle = degToRad(fPhi2 - fPhi1), - name = name - ) - } - "TGeoPcon" -> { - val fDphi by shape.meta.double(0.0) - val fNz by shape.meta.int(2) - val fPhi1 by shape.meta.double(360.0) - val fRmax by shape.meta.doubleArray() - val fRmin by shape.meta.doubleArray() - val fZ by shape.meta.doubleArray() - if (fNz == 2) { - coneSurface( - bottomOuterRadius = fRmax[0], - bottomInnerRadius = fRmin[0], - height = fZ[1] - fZ[0], - topOuterRadius = fRmax[1], - topInnerRadius = fRmin[1], + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + }.apply(block) + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = name, + block = block + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, startAngle = degToRad(fPhi1), - angle = degToRad(fDphi), - name = name - ) { - z = (fZ[1] + fZ[0]) / 2 - } - } else { - TODO() + angle = degToRad(fPhi2 - fPhi1), + name = name, + block = block + ) } - } - "TGeoPgon" -> { - val fDphi by shape.meta.double(0.0) - val fNz by shape.meta.int(2) - val fPhi1 by shape.meta.double(360.0) - val fRmax by shape.meta.doubleArray() - val fRmin by shape.meta.doubleArray() - val fZ by shape.meta.doubleArray() + "TGeoPcon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + if (fNz == 2) { + coneSurface( + bottomOuterRadius = fRmax[0], + bottomInnerRadius = fRmin[0], + height = fZ[1] - fZ[0], + topOuterRadius = fRmax[1], + topInnerRadius = fRmin[1], + startAngle = degToRad(fPhi1), + angle = degToRad(fDphi), + name = name, + ) { + z = (fZ[1] + fZ[0]) / 2 - val fNedges by shape.meta.int(1) + }.apply(block) + } else { + TODO() + } + } + "TGeoPgon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() - val startphi = degToRad(fPhi1) - val deltaphi = degToRad(fDphi) + val fNedges by shape.meta.int(1) - extruded(name) { - //getting the radius of first - require(fNz > 1) { "The polyhedron geometry requires at least two planes" } - val baseRadius = fRmax[0] - shape { - (0..fNedges).forEach { - val phi = deltaphi * fNedges * it + startphi - (baseRadius * cos(phi) to baseRadius * sin(phi)) + val startphi = degToRad(fPhi1) + val deltaphi = degToRad(fDphi) + + extruded(name) { + //getting the radius of first + require(fNz > 1) { "The polyhedron geometry requires at least two planes" } + val baseRadius = fRmax[0] + shape { + (0..fNedges).forEach { + val phi = deltaphi * fNedges * it + startphi + (baseRadius * cos(phi) to baseRadius * sin(phi)) + } } - } - (0 until fNz).forEach { index -> - //scaling all radii relative to first layer radius - layer(fZ[index], scale = fRmax[index] / baseRadius) + (0 until fNz).forEach { index -> + //scaling all radii relative to first layer radius + layer(fZ[index], scale = fRmax[index] / baseRadius) + } + }.apply(block) + } + "TGeoShapeAssembly" -> { + val fVolume by shape.dObject(::DGeoVolume) + fVolume?.let { volume -> + addRootVolume(volume, context, block = block) } } - } - "TGeoShapeAssembly" -> { - val fVolume by shape.dObject(::DGeoVolume) - fVolume?.let { volume -> - addRootVolume(volume, context) + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name, block = block) + } + else -> { + TODO("A shape with type ${shape.typename} not implemented") } - } - "TGeoBBox" -> { - box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name) - } - else -> { - TODO("A shape with type ${shape.typename} not implemented") } } private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { val volume = obj.fVolume ?: return - addRootVolume(volume, context, obj.fName).apply { + addRootVolume(volume, context, obj.fName) { + if (context.bottomLayer > 0) { + this.layer = context.bottomLayer + } when (obj.typename) { "TGeoNodeMatrix" -> { val fMatrix by obj.dObject(::DGeoMatrix) - useMatrix(fMatrix) + this.useMatrix(fMatrix) } "TGeoNodeOffset" -> { val fOffset by obj.meta.double(0.0) @@ -227,19 +244,29 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { } } -private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid { +private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { val group = SolidGroup { - if(volume.fNodes.isEmpty()) { + val nodesNum = volume.fNodes.size + if (nodesNum == 0) { //TODO add smart filter volume.fShape?.let { shape -> addShape(shape, context) } } + val expectedLayerSize = context.layers.last() + nodesNum + //If expected number exceeds layer limit, move everything else to the bottom layer. + if (expectedLayerSize >= context.layerLimits[context.bottomLayer]) { + context.addLayer() + println("Adding new layer. Sizes after add: ${context.layers}") + } + context.layers[context.bottomLayer] += nodesNum volume.fNodes.forEach { node -> addRootNode(node, context) } } - return if (group.children.size == 1 && group.meta.isEmpty()) { + return if (group.isEmpty()) { + null + } else if (group.children.size == 1 && group.meta.isEmpty()) { (group.children.values.first() as Solid).apply { parent = null } } else { group @@ -252,8 +279,15 @@ private fun SolidGroup.addRootVolume( volume: DGeoVolume, context: RootToSolidContext, name: String? = null, - cache: Boolean = true -): Solid { + cache: Boolean = true, + block: Solid.() -> Unit = {} +) { + //skip if maximum layer number is reached + if (context.bottomLayer > context.maxLayer){ + println("Maximum layer depth reached. Skipping ${volume.fName}") + return + } + val combinedName = if (volume.fName.isEmpty()) { name } else if (name == null) { @@ -262,23 +296,29 @@ private fun SolidGroup.addRootVolume( "${name}_${volume.fName}" } - return if (!cache) { - val group = buildVolume(volume, context) + if (!cache) { + val group = buildVolume(volume, context)?.apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } + block() + } set(combinedName?.let { Name.parse(it) }, group) - group } else { val templateName = volumesName + volume.name val existing = getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - set(templateName, buildVolume(volume, context)) + val group = buildVolume(volume, context) + set(templateName, group) } } - ref(templateName, name) - }.apply { - volume.fFillColor?.let { - meta[MATERIAL_COLOR_KEY] = RootColors[it] + ref(templateName, name).apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } + block() } } } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 3818cada..a7bf2709 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -65,12 +65,6 @@ application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") } -tasks.withType() { - kotlinOptions { - freeCompilerArgs = freeCompilerArgs + "-Xir-property-lazy-initialization" - } -} - //distributions { // main { // contents { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index e8995009..16e1b3fe 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -9,6 +9,8 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids +import java.nio.file.Paths +import kotlin.io.path.writeText private fun Meta.countTypes(): Sequence = sequence { @@ -37,12 +39,18 @@ fun main() { val solid = geo.toSolid() - //Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid)) context.makeVisionFile { vision("canvas") { solid + } + } +} + + + /* SolidGroup { set( "Coil", @@ -99,6 +107,3 @@ fun main() { } }*//* }*/ - } - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 24f28924..a1def2dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true #kotlin.jupyter.add.scanner=false -kotlin.incremental.js.klib=false +#kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 6be045d6..d746e14a 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -83,7 +83,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } obj.children.entries .filter { !it.key.toString().startsWith("@") } // ignore statics and other hidden children - .sortedBy { (it.value as? VisionGroup)?.isEmpty ?: true } // ignore empty groups + .sortedBy { (it.value as? VisionGroup)?.isEmpty() ?: true } // ignore empty groups .forEach { (childToken, child) -> styledDiv { css { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 12fe243b..a8ad1dcd 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -63,7 +63,7 @@ public interface VisionGroup : Provider, Vision, VisionContainer { */ public operator fun VisionGroup.iterator(): Iterator = children.values.iterator() -public val VisionGroup.isEmpty: Boolean get() = this.children.isEmpty() +public fun VisionGroup.isEmpty(): Boolean = this.children.isEmpty() public interface VisionContainerBuilder { //TODO add documentation diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index ffe35cc7..9837c60a 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -67,8 +67,8 @@ internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String): if (!skip) { logger.debug("File $fullPath does not exist or wrong checksum. Writing file") Files.createDirectories(fullPath.parent) - Files.write(fullPath, bytes, StandardOpenOption.CREATE, StandardOpenOption.WRITE) - Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.WRITE) + Files.write(fullPath, bytes, StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) + Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) } return if (htmlPath.isAbsolute && fullPath.startsWith(htmlPath.parent)) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt index baced452..7f42a3eb 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt @@ -57,8 +57,8 @@ public inline fun VisionContainerBuilder.box( ySize: Number, zSize: Number, name: String? = null, - action: Box.() -> Unit = {}, -): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(action).also { set(name, it) } + block: Box.() -> Unit = {}, +): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(block).also { set(name, it) } @Serializable @SerialName("solid.hexagon") -- 2.34.1 From d131dc49abad5f48a88c39d83b87bfdf8ea66ec2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 15:24:52 +0300 Subject: [PATCH 036/143] Removed KApt --- .../src/main/kotlin/VisionForgePlayGroundForJupyter.kt | 2 -- gradle.properties | 2 +- jupyter/visionforge-gdml-jupyter/build.gradle.kts | 6 +++++- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 2 -- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 12426672..5ada35ec 100644 --- a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -6,7 +6,6 @@ import kotlinx.html.script import kotlinx.html.stream.createHTML import kotlinx.html.unsafe import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.annotations.JupyterLibrary import org.jetbrains.kotlinx.jupyter.api.libraries.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental @@ -22,7 +21,6 @@ import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.visionManager -@JupyterLibrary @DFExperimental public class VisionForgePlayGroundForJupyter : JupyterIntegration() { diff --git a/gradle.properties b/gradle.properties index a1def2dd..d472c5ef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true -#kotlin.jupyter.add.scanner=false +kotlin.jupyter.add.scanner=false #kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-gdml-jupyter/build.gradle.kts index 896b44a4..6c1d7c43 100644 --- a/jupyter/visionforge-gdml-jupyter/build.gradle.kts +++ b/jupyter/visionforge-gdml-jupyter/build.gradle.kts @@ -56,4 +56,8 @@ kscience { readme { maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL -} \ No newline at end of file +} + +tasks.named("processJupyterApiResources") { + libraryProducers = listOf("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") +} diff --git a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt index 0b12d3fb..ce32f012 100644 --- a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.gdml.jupyter import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.annotations.JupyterLibrary import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context @@ -16,7 +15,6 @@ import space.kscience.visionforge.html.embedAndRenderVisionFragment import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.visionManager -@JupyterLibrary @DFExperimental internal class GdmlForJupyter : JupyterIntegration() { -- 2.34.1 From 42eb0a6f6614024a851ac2dacd38d95ebe9ae8fa Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 18:50:59 +0300 Subject: [PATCH 037/143] Revert dumb composite for GDML --- .../kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt | 2 +- .../kotlin/space/kscience/visionforge/solid/Composite.kt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 8d5ebd49..2d3da074 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -215,7 +215,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val first: GdmlSolid = solid.first.resolve(root) ?: error("") val second: GdmlSolid = solid.second.resolve(root) ?: error("") val type: CompositeType = when (solid) { - is GdmlUnion -> CompositeType.GROUP // dumb sum for better performance + is GdmlUnion -> CompositeType.UNION // dumb sum for better performance is GdmlSubtraction -> CompositeType.SUBTRACT is GdmlIntersection -> CompositeType.INTERSECT } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index a68ff645..ecbb4177 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -32,7 +32,9 @@ public inline fun VisionContainerBuilder.composite( ): Composite { val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() - if (children.size != 2) error("Composite requires exactly two children, but found ${children.size}") + if (children.size != 2){ + error("Composite requires exactly two children, but found ${children.size}") + } val res = Composite(type, children[0], children[1]) res.meta.update(group.meta) -- 2.34.1 From 0ec903370279758a4c40ac138c1cba29cbae609f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 14 Sep 2021 14:02:36 +0300 Subject: [PATCH 038/143] Add Trapezioid and scaled to root converter --- build.gradle.kts | 4 +- .../kotlin/ru/mipt/npm/root/DObject.kt | 12 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 41 +- demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt | 8 +- .../visionforge/gdml/demo/GDMLAppComponent.kt | 7 +- .../src/main/kotlin/gravityDemo.kt | 5 +- .../src/main/kotlin/markupComponent.kt | 4 +- .../src/main/kotlin/plotlyComponent.kt | 2 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 7 +- .../src/jvmMain/kotlin/rootParser.kt | 11 +- .../src/jvmMain/resources/root/BM@N.root.json | 26920 ---------------- .../jvmMain/resources/root/BM@N_geometry.zip | Bin 0 -> 84791 bytes settings.gradle.kts | 4 +- .../visionforge/bootstrap/outputConfig.kt | 11 +- .../visionforge/bootstrap/reactBootstrap.kt | 17 +- .../visionforge/bootstrap/tabComponent.kt | 8 +- .../visionforge/bootstrap/threeControls.kt | 9 +- .../kscience/visionforge/react/MetaViewer.kt | 19 +- .../visionforge/react/MultiSelectChooser.kt | 4 +- .../visionforge/react/PropertyEditor.kt | 4 +- .../visionforge/react/RangeValueChooser.kt | 4 +- .../visionforge/react/ThreeCanvasComponent.kt | 2 +- .../kscience/visionforge/react/VisionTree.kt | 4 +- .../kscience/visionforge/react/layout.kt | 5 +- .../visionforge/react/valueChooser.kt | 17 +- ui/ring/src/main/kotlin/ringui/Loader.kt | 5 +- .../src/main/kotlin/ringui/LoaderScreen.kt | 4 +- .../ThreeViewWithControls.kt | 4 +- .../ringThreeControls.kt | 15 +- 29 files changed, 153 insertions(+), 27004 deletions(-) delete mode 100644 demo/playground/src/jvmMain/resources/root/BM@N.root.json create mode 100644 demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip diff --git a/build.gradle.kts b/build.gradle.kts index 1984e3d3..4ad95112 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("ru.mipt.npm.gradle.project") - kotlin("multiplatform") version "1.5.30" apply false - kotlin("js") version "1.5.30" apply false +// kotlin("multiplatform") version "1.5.30" apply false +// kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.1") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 712e1a4e..9f4d1971 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -85,13 +85,23 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fFillColor: Int? by meta.int() override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } + + public val numberOfChildren: Int by lazy { + fNodes.sumOf { (it.fVolume?.numberOfChildren ?: 0) + 1 } + } } public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { public val fVolume: DGeoVolume? by dObject(::DGeoVolume) } -public class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +public open class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) + +public open class DGeoScale(meta: Meta, refCache: DObjectCache) : DGeoMatrix(meta, refCache) { + public val fScale: DoubleArray by meta.doubleArray(1.0, 1.0, 1.0) + public val x: Double get() = fScale[0] + public val y: Double get() = fScale[1] + public val z: Double get() = fScale[2] } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index ed0b76fd..a11f1996 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -182,6 +182,7 @@ private fun SolidGroup.addShape( } } "TGeoPgon" -> { + //TODO add a inner polygone layer val fDphi by shape.meta.double(0.0) val fNz by shape.meta.int(2) val fPhi1 by shape.meta.double(360.0) @@ -219,6 +220,44 @@ private fun SolidGroup.addShape( "TGeoBBox" -> { box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name, block = block) } + "TGeoTrap" -> { + val fTheta by shape.meta.double(0.0) + val fPhi by shape.meta.double(0.0) + val fAlpha1 by shape.meta.double(0.0) + val fAlpha2 by shape.meta.double(0.0) + if (fAlpha1 != 0.0 || fAlpha2 != 0.0 || fTheta != 0.0 || fPhi != 0.0) { + TODO("Angled trapezoid not implemented") + } + val fH1 by shape.meta.double(0.0) + val fBl1 by shape.meta.double(0.0) + val fTl1 by shape.meta.double(0.0) + val fH2 by shape.meta.double(0.0) + val fBl2 by shape.meta.double(0.0) + val fTl2 by shape.meta.double(0.0) + + val fDz by shape.meta.double(0.0) + //TODO check proper node order + val node1 = Point3D(-fBl1, -fH1, -fDz) + val node2 = Point3D(fBl1, -fH1, -fDz) + val node3 = Point3D(fTl1, fH1, -fDz) + val node4 = Point3D(-fTl1, fH1, -fDz) + val node5 = Point3D(-fBl2, -fH2, fDz) + val node6 = Point3D(fBl2, -fH2, fDz) + val node7 = Point3D(fTl2, fH2, fDz) + val node8 = Point3D(-fTl2, fH2, fDz) + hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) + } + "TGeoScaledShape" -> { + val fShape by shape.dObject(::DGeoShape) + val fScale by shape.dObject(::DGeoScale) + fShape?.let { scaledShape -> + group(name?.let { Name.parse(it) }) { + scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) + addShape(scaledShape, context) + apply(block) + } + } + } else -> { TODO("A shape with type ${shape.typename} not implemented") } @@ -283,7 +322,7 @@ private fun SolidGroup.addRootVolume( block: Solid.() -> Unit = {} ) { //skip if maximum layer number is reached - if (context.bottomLayer > context.maxLayer){ + if (context.bottomLayer > context.maxLayer) { println("Maximum layer depth reached. Skipping ${volume.fName}") return } diff --git a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt index a52343b0..635c4580 100644 --- a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt +++ b/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt @@ -6,8 +6,8 @@ package drop import org.w3c.dom.DragEvent import org.w3c.files.FileList import react.Component -import react.RProps -import react.RState +import react.Props +import react.State external enum class DropEffects { copy, @@ -16,7 +16,7 @@ external enum class DropEffects { none } -external interface FileDropProps: RProps { +external interface FileDropProps: Props { var className: String? var targetClassName: String? var draggingOverFrameClassName: String? @@ -32,7 +32,7 @@ external interface FileDropProps: RProps { var dropEffect: DropEffects? } -external interface FileDropState: RState { +external interface FileDropState: State { var draggingOverFrame: Boolean var draggingOverTarget: Boolean } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 4c4fc43c..ae8b8ac8 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -7,8 +7,11 @@ import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get -import react.* +import react.RProps import react.dom.h2 +import react.functionComponent +import react.useMemo +import react.useState import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.Name @@ -31,7 +34,7 @@ external interface GDMLAppProps : RProps { } @JsExport -val GDMLApp = functionalComponent("GDMLApp") { props -> +val GDMLApp = functionComponent("GDMLApp") { props -> val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } var deferredVision: Deferred by useState { CompletableDeferred(props.vision) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index eec16afe..e6f2273a 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -3,8 +3,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* import react.RProps -import react.child -import react.functionalComponent +import react.functionComponent import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace @@ -21,7 +20,7 @@ external interface DemoProps : RProps { var context: Context } -val GravityDemo = functionalComponent { props -> +val GravityDemo = functionComponent { props -> val velocityTrace = Trace{ name = "velocity" } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 879ab3df..52696f8a 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -7,7 +7,7 @@ import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.RProps -import react.functionalComponent +import react.functionComponent import react.useEffect import react.useRef import space.kscience.visionforge.markup.VisionOfMarkup @@ -20,7 +20,7 @@ external interface MarkupProps : RProps { var markup: VisionOfMarkup? } -val Markup = functionalComponent("Markup") { props -> +val Markup = functionComponent("Markup") { props -> val elementRef = useRef(null) useEffect(props.markup, elementRef) { diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index 22f63ac8..fa73f298 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -14,7 +14,7 @@ external interface PlotlyProps : RProps { } -val Plotly = functionalComponent("Plotly") { props -> +val Plotly = functionComponent("Plotly") { props -> val elementRef = useRef(null) useEffect(props.plot, elementRef) { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 1a7fe071..f4ea0206 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -7,10 +7,13 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction -import react.* +import react.RProps import react.dom.attrs import react.dom.button import react.dom.p +import react.functionComponent +import react.useMemo +import react.useState import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.visionforge.react.flexColumn @@ -34,7 +37,7 @@ external interface MMAppProps : RProps { @OptIn(DelicateCoroutinesApi::class) @JsExport -val MMApp = functionalComponent("Muon monitor") { props -> +val MMApp = functionComponent("Muon monitor") { props -> val mmOptions = useMemo { Canvas3DOptions { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 16e1b3fe..80555bc5 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids import java.nio.file.Paths +import java.util.zip.ZipInputStream import kotlin.io.path.writeText @@ -25,8 +26,11 @@ fun main() { plugin(Solids) } - val string = TGeoManager::class.java.getResourceAsStream("/root/BM@N.root.json")!! - .readAllBytes().decodeToString() + + val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { + it.nextEntry + it.readAllBytes().decodeToString() + } val geo = DGeoManager.parse(string) @@ -45,12 +49,11 @@ fun main() { context.makeVisionFile { vision("canvas") { solid - } + } } } - /* SolidGroup { set( "Coil", diff --git a/demo/playground/src/jvmMain/resources/root/BM@N.root.json b/demo/playground/src/jvmMain/resources/root/BM@N.root.json deleted file mode 100644 index 9058d156..00000000 --- a/demo/playground/src/jvmMain/resources/root/BM@N.root.json +++ /dev/null @@ -1,26920 +0,0 @@ -{ - "_typename" : "TGeoManager", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "FAIRGeom", - "fTitle" : "FAIR geometry", - "fNNodes" : 413815, - "fVisDensity" : 0, - "fExplodedView" : 0, - "fVisOption" : 1, - "fVisLevel" : 3, - "fNsegments" : 20, - "fNtracks" : 0, - "fMaxVisNodes" : 10000, - "fNpdg" : 257, - "fPdgId" : [1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 11, -11, 12, -12, 13, -13, 14, -14, 15, -15, 16, -16, 17, -17, 18, -18, 21, 22, 23, 24, -24, 25, 28, 29, 32, 33, 34, -34, 35, 36, 37, -37, 38, 39, -39, 40, -40, 51, 52, -52, 53, 54, 55, -55, 56, 61, -61, 62, -62, 63, -63, 64, -64, 65, -65, 66, -66, 81, 82, -82, 83, 84, -84, 85, -85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 111, 113, 115, 130, 210, -210, 211, -211, 213, -213, 215, -215, 220, 221, 223, 225, 310, 311, -311, 313, -313, 315, -315, 321, -321, 323, -323, 325, -325, 330, 331, 333, 335, 411, -411, 413, -413, 415, -415, 421, -421, 423, -423, 425, -425, 431, -431, 433, -433, 435, -435, 440, 441, 443, 445, 511, -511, 513, -513, 515, -515, 521, -521, 523, -523, 525, -525, 531, -531, 533, -533, 535, -535, 541, -541, 543, -543, 545, -545, 551, 553, 555, 1103, -1103, 1114, -1114, 2101, -2101, 2103, -2103, 2110, -2110, 2112, -2112, 2114, -2114, 2203, -2203, 2210, -2210, 2212, -2212, 2214, -2214, 2224, -2224, 3101, -3101, 3103, -3103, 3112, -3112, 3114, -3114, 3122, -3122, 3201, -3201, 3203, -3203, 3212, -3212, 3214, -3214, 3222, -3222, 3224, -3224, 3303, -3303, 3312, -3312, 3314, -3314, 3322, -3322, 3324, -3324, 3334, -3334, 4101, -4101, 4103, -4103, 4112, -4112, 4114, -4114, 4122, -4122, 4132, -4132, 4201, -4201, 4203, -4203, 4212, -4212, 4214, -4214, 4222, -4222, 4224, -4224, 4232, -4232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fStreamVoxels" : false, - "fPhiCut" : false, - "fTimeCut" : false, - "fMatrices" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoIdentity", - "fUniqueID" : 1, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 2, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 3, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 4, - "fBits" : 52559872, - "fName" : "t5", - "fTitle" : "", - "fTranslation" : [0, -7.13984375, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 5, - "fBits" : 52559872, - "fName" : "t9", - "fTitle" : "", - "fTranslation" : [0, -4.7421875, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 6, - "fBits" : 52559872, - "fName" : "GlassLayer1PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -0.475] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 7, - "fBits" : 52559872, - "fName" : "GlassLayer2PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, 0.219] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 8, - "fBits" : 52559872, - "fName" : "G10LayerPosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, 0.642] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 9, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 0, 1052.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 10, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 11, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.65, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 12, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 13, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 14, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 15, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 16, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -49.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 17, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 18, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -48.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 19, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 20, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -49.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 21, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.55, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 22, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -48.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 23, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 24, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 25, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 26, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 27, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -46.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 28, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -45.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 29, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -46.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 30, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -45.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 31, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 32, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 33, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 34, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 35, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -43.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 36, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -42.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 37, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -43.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 38, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -42.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 39, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 40, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 41, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 42, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 43, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -40.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 44, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -39.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 45, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -40.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 46, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -39.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 47, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 48, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 49, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 50, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 51, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -37.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 52, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -36.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 53, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -37.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 54, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -36.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 55, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 56, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 57, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 58, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 59, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -34.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 60, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -33.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 61, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -34.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 62, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -33.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 63, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 64, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 65, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 66, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 67, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -31.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 68, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -30.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 69, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -31.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 70, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -30.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 71, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 72, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 73, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 74, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 75, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -28.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 76, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -27.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 77, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -28.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 78, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -27.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 79, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 80, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 81, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 82, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 83, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -25.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 84, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -24.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 85, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -25.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 86, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -24.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 87, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 88, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 89, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 90, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 91, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -22.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 92, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -21.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 93, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -22.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 94, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -21.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 95, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 96, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 97, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 98, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 99, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 100, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 101, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 102, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 103, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 104, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 105, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 106, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 107, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 108, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 109, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 110, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 111, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 112, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 113, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 114, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 115, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 116, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 117, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 118, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 119, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 120, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 121, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 122, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 123, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 124, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 125, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 126, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 127, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 128, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 129, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 130, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 131, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 132, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 133, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 134, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 135, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 136, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 137, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 138, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 139, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 140, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 141, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 142, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 143, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 144, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 145, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 146, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 147, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 148, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 149, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 150, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 151, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 152, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 153, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 154, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 155, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 156, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 157, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 158, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 159, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 160, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 161, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 162, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 163, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 164, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 165, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 166, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 167, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 168, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 169, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 170, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 171, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 172, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 173, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 174, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 175, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 176, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 177, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 178, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 179, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 180, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 181, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 182, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 183, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 184, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 185, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 186, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 187, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 188, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 189, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 190, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 191, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 192, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 193, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 194, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 195, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 196, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 197, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 198, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 199, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 200, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 201, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 202, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 203, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 204, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 20.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 205, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 206, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 20.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 207, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 21.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 208, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 209, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 21.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 210, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 211, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 212, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 23.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 213, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 214, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 23.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 215, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 24.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 216, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 217, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 24.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 218, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 219, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 220, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 26.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 221, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 222, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 26.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 223, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 27.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 224, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 225, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 27.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 226, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 227, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 228, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 29.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 229, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 230, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 29.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 231, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 30.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 232, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 233, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 30.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 234, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 235, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 236, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 32.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 237, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 238, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 32.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 239, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 33.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 240, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 241, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 33.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 242, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 243, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 244, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 35.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 245, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 246, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 35.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 247, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 36.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 248, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 249, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 36.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 250, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 251, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 252, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 38.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 253, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 254, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 38.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 255, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 39.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 256, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 257, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 39.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 258, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 259, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 260, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 41.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 261, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 262, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 41.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 263, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 42.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 264, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 265, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 42.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 266, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 267, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 268, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 44.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 269, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 270, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 44.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 271, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 45.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 272, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 273, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 45.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 274, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 275, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 276, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 47.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 277, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 278, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 47.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 279, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 48.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 280, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 281, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 48.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 282, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 283, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 284, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 285, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 286, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 287, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 288, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 289, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 290, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 291, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 292, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 293, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 294, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 295, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 296, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 297, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 298, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 299, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 300, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 301, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 302, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 303, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 304, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 305, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 306, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 307, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 308, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 309, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 310, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 311, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 312, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 313, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 314, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 315, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 316, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 317, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 318, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 319, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 320, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 321, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 322, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 323, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 324, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 325, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 326, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 327, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 328, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 329, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 330, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 331, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 332, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 333, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 334, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 335, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 336, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 337, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 338, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 339, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 340, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 341, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 342, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 343, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 344, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 345, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 346, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 347, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 348, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 349, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 350, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 351, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 352, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 353, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 354, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 355, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 356, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 357, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 358, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 359, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 360, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 361, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 362, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 363, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 364, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 365, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 366, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 367, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 368, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 369, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 370, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 371, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 372, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 373, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 374, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 375, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 376, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 377, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 378, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 379, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 380, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 381, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 382, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 45, 0] - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 383, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 384, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 385, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 386, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 387, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 388, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 389, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 390, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 391, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 392, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 393, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 394, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 395, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 396, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 397, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 398, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 399, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 400, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 401, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 402, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 403, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 404, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 405, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 406, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 407, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 408, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 409, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [27.7, 0, 0.55], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 410, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [-34.7, 0.2, 2.95], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 411, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [27.7, 0, 0.55], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 412, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [-34.7, 0.2, 2.95], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 413, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 414, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 415, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 416, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 417, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 418, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 419, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 420, - "fBits" : 62259200, - "fName" : "c413", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 421, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 422, - "fBits" : 62259200, - "fName" : "c416", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 423, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 424, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 425, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 426, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 427, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 428, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 429, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 430, - "fBits" : 62259200, - "fName" : "c423", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 431, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 432, - "fBits" : 62259200, - "fName" : "c426", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 433, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-29.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 434, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-28.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 435, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-26.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 436, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-25.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 437, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-24.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 438, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-23.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 439, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-21.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 440, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-20.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 441, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-19.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 442, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-18.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 443, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-16.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 444, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-15.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 445, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-14.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 446, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-13.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 447, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-11.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 448, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-10.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 449, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-9.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 450, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-8.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 451, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-6.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 452, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-5.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 453, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-4.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 454, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-3.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 455, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-1.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 456, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-0.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 457, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 458, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [1.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 459, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [3.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 460, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [4.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 461, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [5.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 462, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [6.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 463, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [8.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 464, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [9.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 465, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [10.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 466, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [11.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 467, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [13.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 468, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [14.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 469, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [15.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 470, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [16.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 471, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [18.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 472, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [19.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 473, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [20.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 474, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [21.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 475, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [23.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 476, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [24.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 477, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [25.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 478, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [26.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 479, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [28.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 480, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [29.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 481, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, -0.304499998688698] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 482, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, 0.304499998688698] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 483, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, -1.34000000357628] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 484, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, 1.34000000357628] - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 485, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -11.59375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 486, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -8.28125], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 487, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -4.96875], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 488, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -1.65625], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 489, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 1.65625], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 490, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 4.96875], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 491, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 8.28125], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 492, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 11.59375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 493, - "fBits" : 52559872, - "fName" : "t493", - "fTitle" : "", - "fTranslation" : [0, 0, -2.50375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 494, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, -1.50225], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [0.5, -0.866025403784439, 0, 0.866025403784439, 0.5, -0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 495, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, -0.50075], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-0.5, -0.866025403784439, 0, 0.866025403784439, -0.5, -0, 0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 496, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 0.50075], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1, -0, 0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 497, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 1.50225], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-0.5, 0.866025403784438, 0, -0.866025403784438, -0.5, -0, -0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 498, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 2.50375], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [0.5, 0.866025403784439, 0, -0.866025403784439, 0.5, -0, -0, 0, 1] - } - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 499, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-48, 0, 800] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 500, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 501, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.9] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 502, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 503, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.075] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 504, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 505, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 506, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 507, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 508, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 509, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 510, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 511, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 512, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 513, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 514, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 515, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 516, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 517, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 518, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 519, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 520, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 521, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 522, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 523, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 524, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 525, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 526, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 527, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 528, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 529, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 530, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 531, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 532, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 533, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 534, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 535, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 536, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 537, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 538, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 539, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 540, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 541, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 542, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 543, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 544, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 545, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 546, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 547, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 548, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 549, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 550, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 551, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 552, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 553, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 554, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 555, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 556, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 557, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 558, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 559, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 560, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 561, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 562, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 563, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 564, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 565, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 566, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 567, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 568, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 569, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 570, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 571, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 572, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 573, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 574, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 575, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 576, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 577, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 578, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 579, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 580, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 581, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 582, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 583, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 584, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 585, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 586, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 587, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 588, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 589, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 590, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 591, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 592, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 593, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 594, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 595, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 596, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 597, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 598, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 599, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 600, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 601, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 602, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 603, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 604, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 605, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 606, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 607, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 608, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 609, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 610, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 611, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 612, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 613, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 614, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 615, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 616, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 617, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 618, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 619, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 620, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 621, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 622, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 623, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 624, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 625, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 626, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 627, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 628, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 629, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 630, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 631, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 632, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 633, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 634, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 635, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 636, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 637, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 638, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 639, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 640, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 641, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 642, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 643, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 644, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 645, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 646, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 647, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 648, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 649, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 650, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 651, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 652, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 653, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 654, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 655, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 656, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 657, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 658, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 659, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 660, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 661, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 662, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 663, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 664, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 665, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 666, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 667, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 668, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 669, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 670, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 671, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 672, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 673, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 674, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 675, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 676, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 677, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 678, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 679, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 680, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 681, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 682, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 683, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 684, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 685, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 686, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 687, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 688, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 689, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 690, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 691, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 692, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 693, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 694, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 695, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 696, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 697, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 698, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 699, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 700, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 701, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 702, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 703, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 704, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 705, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 706, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 707, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 708, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 709, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 710, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 711, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 712, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 713, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 714, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 715, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 716, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 717, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 718, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 719, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 720, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 721, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 722, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 723, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 724, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 725, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 726, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 727, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 728, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 729, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 730, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 731, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 732, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 733, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 734, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 735, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 736, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 737, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 738, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 739, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 740, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 741, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 742, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 743, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 744, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 745, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 746, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 747, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 748, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 749, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 750, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 751, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 752, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 753, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 754, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 755, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 756, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 757, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 758, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 759, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 760, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 761, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 762, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 763, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 764, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 765, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 766, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 767, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 768, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 769, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 770, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 771, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 772, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 773, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 774, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 775, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 776, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 777, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 778, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 779, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 780, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 781, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 782, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 783, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 784, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 785, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 786, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 787, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 788, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 789, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 790, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 791, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 792, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 793, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 794, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 795, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 796, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 797, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 798, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 799, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 800, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 801, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 802, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 803, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 804, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 805, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 806, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 807, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 808, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 809, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 810, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 811, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [108, 0, 800] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t814", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t814", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t822", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t822", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t824", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t824", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t826", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t826", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 1, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }] - }, - "fShapes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoBBox", - "fUniqueID" : 1, - "fBits" : 50331648, - "fName" : "cave", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2000, - "fDY" : 2000, - "fDZ" : 2000, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "CoilTS", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1+CoilLongSideS:tran_CoilLongSide2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 4, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 67.5, - "fOrigin" : [0, 0, -189.6], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoTubeSeg", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilCornerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 25600, - "fDX" : 67.5, - "fDY" : 67.5, - "fDZ" : 25, - "fOrigin" : [67.5, 67.5, 0], - "fRmin" : 25, - "fRmax" : 135, - "fDz" : 25, - "fPhi1" : 0, - "fPhi2" : 90, - "fS1" : 0, - "fC1" : 1, - "fS2" : 1, - "fC2" : 6.12323399573677e-17, - "fSm" : 0.707106781186547, - "fCm" : 0.707106781186548, - "fCdfi" : 0.707106781186548 - }, - "fRight" : {"$ref":863}, - "fLeftMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner1", - "fTitle" : "", - "fTranslation" : [79.6, 0, -122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] - } - }, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner2", - "fTitle" : "", - "fTranslation" : [-79.6, 0, -122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 0, 0, 0, -1, 0, -1, 0] - } - } - } - }, - "fRight" : {"$ref":863}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner3", - "fTitle" : "", - "fTranslation" : [-79.6, 0, 122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 0, 0, 0, 1, 0, 1, 0] - } - } - } - }, - "fRight" : {"$ref":863}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner4", - "fTitle" : "", - "fTranslation" : [79.6, 0, 122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, -1, 0, 1, 0] - } - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilShortSideS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 79.6, - "fDY" : 25, - "fDZ" : 55, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilShortSide1", - "fTitle" : "", - "fTranslation" : [0, 0, -202.1] - } - } - }, - "fRight" : {"$ref":872}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilShortSide2", - "fTitle" : "", - "fTranslation" : [0, 0, 202.1] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilLongSideS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 55, - "fDY" : 25, - "fDZ" : 122.1, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilLongSide1", - "fTitle" : "", - "fTranslation" : [-159.6, 0, 0] - } - } - }, - "fRight" : {"$ref":875}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilLongSide2", - "fTitle" : "", - "fTranslation" : [159.6, 0, 0] - } - } - }, {"$ref":851}, {"$ref":853}, {"$ref":855}, {"$ref":857}, {"$ref":859}, {"$ref":861}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 9, - "fBits" : 50331648, - "fName" : "YokeS", - "fTitle" : "YokeContainerS-InnerSpaceInYokeS", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 130, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "YokeContainerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 130, - "fOrigin" : [0, 0, 0], - "fNvert" : 8, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [-303.81197846483, -350, -350, -303.81197846483, 303.81197846483, 350, 350, 303.81197846483], - "fY" : [-224, -144, 144, 224, 224, 144, -144, -224], - "fZ" : [-130, 130], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "InnerSpaceInYokeS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 230, - "fDY" : 115, - "fDZ" : 130.005, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : {"$ref":4} - } - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 10, - "fBits" : 50331648, - "fName" : "PoleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 84, - "fDY" : 124.5, - "fDZ" : 30.75, - "fOrigin" : [0, 0, 0], - "fNvert" : 8, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [-54, -84, -84, -54, 54, 84, 84, 54], - "fY" : [-124.5, -94.5, 94.5, 124.5, 124.5, 94.5, -94.5, -124.5], - "fZ" : [-30.75, 30.75], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 11, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.215, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 0.54921875, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.208, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 15, - "fBits" : 50331648, - "fName" : "TOF2ChamberS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 9.501, - "fDY" : 19.076, - "fDZ" : 0.841, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.215, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 0.9484375, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.208, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 20, - "fBits" : 50331648, - "fName" : "TOF2ChamberS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 29.501, - "fDY" : 16.676, - "fDZ" : 0.841, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "VETO", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 83.5, - "fDY" : 53.5, - "fDZ" : 52.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 22, - "fBits" : 50331648, - "fName" : "VMDL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.5, - "fDY" : 7.5, - "fDZ" : 52, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 23, - "fBits" : 50331648, - "fName" : "VFEL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 24, - "fBits" : 50331648, - "fName" : "VPBL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 25, - "fBits" : 50331648, - "fName" : "VSCL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 26, - "fBits" : 50331648, - "fName" : "VRFL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 27, - "fBits" : 50331648, - "fName" : "VRPL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 28, - "fBits" : 50331648, - "fName" : "VRSL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 29, - "fBits" : 50331648, - "fName" : "UMDL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.75, - "fDY" : 3.75, - "fDZ" : 52, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 30, - "fBits" : 50331648, - "fName" : "USCL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 31, - "fBits" : 50331648, - "fName" : "URSL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.1, - "fDY" : 3.65, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 32, - "fBits" : 50331648, - "fName" : "UPBL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 33, - "fBits" : 50331648, - "fName" : "UFEL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 34, - "fBits" : 50331648, - "fName" : "URFL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.1, - "fDY" : 3.65, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 35, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_6051", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "module_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoTube", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "holeS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 9216, - "fDX" : 5.75, - "fDY" : 5.75, - "fDZ" : 0.46, - "fOrigin" : [0, 0, 0], - "fRmin" : 0, - "fRmax" : 5.75, - "fDz" : 0.46 - }, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_6051", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 36, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_9663", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_9663", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 37, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_3220", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_3220", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 38, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_9357", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_9357", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 39, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 40, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 41, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 42, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station0_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":922}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "HE_GAS", - "fTitle" : "", - "fId" : 12, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "HE_GAS", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 13, - "fA" : 4, - "fZ" : 2, - "fDensity" : 1.78e-4, - "fRadLen" : 479968.980732484, - "fIntLen" : 312331.95325677, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 32, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":925}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":384} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":928}, - "fMother" : {"$ref":925}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":385} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station0_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":923}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "carbon", - "fTitle" : "", - "fId" : 18, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "carbon", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 17, - "fA" : 12.011, - "fZ" : 6, - "fDensity" : 2.265, - "fRadLen" : 18.7627684755763, - "fIntLen" : 35.4089682265511, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 33, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":925}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":386} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":933}, - "fMother" : {"$ref":925}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":387} - }] - }, - "fShape" : {"$ref":924}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 1, - "fBits" : 50331648, - "fName" : "air", - "fTitle" : "", - "fId" : 1, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 1, - "fBits" : 50462720, - "fName" : "air", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 0, - "fA" : 14.6873, - "fZ" : 7.32, - "fDensity" : 0.001205, - "fRadLen" : 30422.5122009781, - "fIntLen" : 70886.8082068035, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 3, - "fZmixture" : [7, 8, 18], - "fAmixture" : [14.01, 16, 39.95], - "fWeights" : [0.78, 0.21, 0.01], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 34, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 43, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":921}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 11, - "fBits" : 50331648, - "fName" : "IRON", - "fTitle" : "", - "fId" : 11, - "fParams" : [0, 1, 0.19, 1, -1, -1, 0.1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 9, - "fBits" : 50462720, - "fName" : "IRON", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 8, - "fA" : 55.85, - "fZ" : 26, - "fDensity" : 7.87, - "fRadLen" : 1.75771664360148, - "fIntLen" : 16.9675125483994, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 31, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":940}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":388} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":925}, - "fMother" : {"$ref":940}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":389} - }] - }, - "fShape" : {"$ref":939}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 35, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 44, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 45, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 46, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 47, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station1_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":948}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 37, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":951}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":390} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":954}, - "fMother" : {"$ref":951}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":391} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station1_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":949}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 38, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":951}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":392} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":957}, - "fMother" : {"$ref":951}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":393} - }] - }, - "fShape" : {"$ref":950}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 39, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 48, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":947}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "arco27030", - "fTitle" : "", - "fId" : 17, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "arco27030", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 16, - "fA" : 36.5434594614837, - "fZ" : 16.5659958077497, - "fDensity" : 0.0019, - "fRadLen" : 10960.19206385, - "fIntLen" : 59730.4440787846, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 3, - "fZmixture" : [18, 6, 8], - "fAmixture" : [39.948, 12.01, 15.9994], - "fWeights" : [0.864021297422359, 0.0371085832369314, 0.0988701193407093], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 36, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":960}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":394} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":951}, - "fMother" : {"$ref":960}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":395} - }] - }, - "fShape" : {"$ref":959}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 40, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 49, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 50, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 51, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 52, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station2_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":968}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 42, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":971}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":396} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":974}, - "fMother" : {"$ref":971}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":397} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station2_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":969}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 43, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":971}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":398} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":977}, - "fMother" : {"$ref":971}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":399} - }] - }, - "fShape" : {"$ref":970}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 44, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 53, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":967}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 41, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":980}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":400} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":971}, - "fMother" : {"$ref":980}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":401} - }] - }, - "fShape" : {"$ref":979}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 45, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 54, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.55, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 55, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 56, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 57, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 58, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station3_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":987}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 48, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":990}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":402} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":993}, - "fMother" : {"$ref":990}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":403} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station3_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":988}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 49, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":990}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":404} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":996}, - "fMother" : {"$ref":990}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":405} - }] - }, - "fShape" : {"$ref":989}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 50, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 59, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 60, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 61, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame1_station3_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":998}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 51, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1001}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":406} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1004}, - "fMother" : {"$ref":1001}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":407} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame1_station3_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":999}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 52, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1001}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":408} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1007}, - "fMother" : {"$ref":1001}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":409} - }] - }, - "fShape" : {"$ref":1000}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 53, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 62, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 69.2, - "fDY" : 24.35, - "fDZ" : 2.4, - "fOrigin" : [-3.5, 0.0999999999999996, 1.7], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":985}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 46, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":410} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":986}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 47, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":411} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":990}, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":412} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1001}, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":413} - }] - }, - "fShape" : {"$ref":1009}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 54, - "fNtotal" : 13, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 63, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 64, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 65, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 66, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1018}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 57, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":414} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1019}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 58, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":415} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1020}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 59, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":416} - }] - }, - "fShape" : {"$ref":1021}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 60, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 67, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 68, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 69, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 70, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1030}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 61, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":417} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1031}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 62, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":418} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1032}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 63, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":419} - }] - }, - "fShape" : {"$ref":1033}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 64, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 71, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":907}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 55, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":420} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":912}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 56, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":421} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1022}, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":423} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1034}, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":424} - }] - }, - "fShape" : {"$ref":1042}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 65, - "fNtotal" : 11, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 72, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 73, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 74, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 75, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1051}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 68, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":426} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1052}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 69, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":427} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1053}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 70, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":428} - }] - }, - "fShape" : {"$ref":1054}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 71, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 76, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 77, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 78, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 79, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1063}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 72, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":429} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1064}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 73, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":430} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1065}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 74, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":431} - }] - }, - "fShape" : {"$ref":1066}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 75, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 80, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":915}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 66, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":432} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":918}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 67, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":433} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1055}, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":435} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1067}, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":436} - }] - }, - "fShape" : {"$ref":1075}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 76, - "fNtotal" : 11, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 81, - "fBits" : 50331648, - "fName" : "StripGas", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.5, - "fDY" : 15, - "fDZ" : 0.150000005960464, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 82, - "fBits" : 50331648, - "fName" : "DetectorGlass", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 0.154499992728233, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 83, - "fBits" : 50331648, - "fName" : "DetectorPlate", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 0.159999996423721, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 84, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 1.5, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "tof1Detector", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1StripActiveGasV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1084}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "RPCgas", - "fTitle" : "", - "fId" : 6, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "RPCgas", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 5, - "fA" : 13.134094, - "fZ" : 6.433, - "fDensity" : 0.00375, - "fRadLen" : 10290.7323640963, - "fIntLen" : 17251.1264038771, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 4, - "fZmixture" : [6, 1, 9, 16], - "fAmixture" : [12.01, 1.008, 19, 32.06], - "fWeights" : [0.227, 0.248, 0.511, 0.014], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 78, - "fNtotal" : 1, - "fRefCount" : 48 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":438} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":439} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":440} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":441} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":442} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":443} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":444} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":445} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":446} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":447} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":448} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":449} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":450} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":451} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":452} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":453} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":454} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":455} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":456} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":457} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":458} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":459} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":460} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":461} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":462} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":463} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":464} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":465} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":466} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":467} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":468} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":469} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":470} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":471} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":472} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":473} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":474} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":475} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":476} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":477} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":478} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":479} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":480} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":481} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":482} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":483} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":484} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":485} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetGlassV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1DetGlassV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1085}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "RPCglass", - "fTitle" : "", - "fId" : 5, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "RPCglass", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 4, - "fA" : 21.6516575137294, - "fZ" : 10.8047928107838, - "fDensity" : 2.55, - "fRadLen" : 10.5807291507198, - "fIntLen" : 37.6225717576057, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [14, 8], - "fAmixture" : [28.09, 16], - "fWeights" : [0.467465468463971, 0.532534531536029], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 79, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":486} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetGlassV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1142}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":487} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetPlateV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1DetPlateV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1086}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "G10", - "fTitle" : "", - "fId" : 7, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "G10", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 6, - "fA" : 13.127344, - "fZ" : 6.696, - "fDensity" : 1.7, - "fRadLen" : 21.1963817958332, - "fIntLen" : 36.4724641224032, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 4, - "fZmixture" : [6, 1, 8, 14], - "fAmixture" : [12.01, 1.008, 16, 28.09], - "fWeights" : [0.259, 0.288, 0.248, 0.205], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 80, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":488} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetPlateV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1147}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":489} - }] - }, - "fShape" : {"$ref":1087}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 81, - "fNtotal" : 53, - "fRefCount" : 62 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 85, - "fBits" : 50331648, - "fName" : "OctagonActivePlaneS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 156.77368629035, - "fDY" : 156.77368629035, - "fDZ" : 0.05, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [12, 12], - "fRmax" : [144.84, 144.84], - "fZ" : [-0.05, 0.05], - "fNedges" : 8 - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 86, - "fBits" : 50331648, - "fName" : "OctagonS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 156.77368629035, - "fDY" : 156.77368629035, - "fDZ" : 13.25, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [12, 12], - "fRmax" : [144.84, 144.84], - "fZ" : [-13.25, 13.25], - "fNedges" : 8 - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 87, - "fBits" : 50331648, - "fName" : "MWPCContainerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 26.15396719429, - "fDY" : 26.15396719429, - "fDZ" : 3.5045, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [0, 0], - "fRmax" : [22.65, 22.65], - "fZ" : [-3.5045, 3.5045], - "fNedges" : 6 - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 88, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 12, - "fDY" : 21.65, - "fDZ" : 0.1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 89, - "fBits" : 50331648, - "fName" : "ecal01", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 48, - "fDY" : 60, - "fDZ" : 27.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 90, - "fBits" : 50331648, - "fName" : "ecal01mod", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 20, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 91, - "fBits" : 50331648, - "fName" : "ecal01front", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 92, - "fBits" : 50331648, - "fName" : "ecal01lay", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 93, - "fBits" : 50331648, - "fName" : "ecal01lead", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 94, - "fBits" : 50331648, - "fName" : "ecal01scint", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2, - "fDY" : 2, - "fDZ" : 0.075, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 95, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS0-upper_window_frameS0:upper_window_frame_pos0)-lower_window_rect_frameS0:lower_window_rect_frame_pos0", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 96, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS0-upper_window_frameS0:upper_window_frame_pos0", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos0", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos0", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1163}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 97, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS1-upper_window_frameS1:upper_window_frame_pos1)-lower_window_bevel_frameS1:lower_window_bevel_frame_pos1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 98, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS1-upper_window_frameS1:upper_window_frame_pos1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos1", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos1", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1172}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 99, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS2-upper_window_frameS2:upper_window_frame_pos2)-lower_window_bevel_frameS2:lower_window_bevel_frame_pos2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 100, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS2-upper_window_frameS2:upper_window_frame_pos2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos2", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos2", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1181}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 101, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS3-upper_window_frameS3:upper_window_frame_pos3)-lower_window_rect_frameS3:lower_window_rect_frame_pos3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 102, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS3-upper_window_frameS3:upper_window_frame_pos3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos3", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos3", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1190}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 103, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS4-upper_window_frameS4:upper_window_frame_pos4)-lower_window_rect_frameS4:lower_window_rect_frame_pos4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 104, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS4-upper_window_frameS4:upper_window_frame_pos4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos4", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos4", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1199}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 105, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS5-upper_window_frameS5:upper_window_frame_pos5)-lower_window_bevel_frameS5:lower_window_bevel_frame_pos5", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 106, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS5-upper_window_frameS5:upper_window_frame_pos5", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos5", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos5", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1208}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 107, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS6-upper_window_frameS6:upper_window_frame_pos6)-lower_window_bevel_frameS6:lower_window_bevel_frame_pos6", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 108, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS6-upper_window_frameS6:upper_window_frame_pos6", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos6", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos6", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1217}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 109, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS7-upper_window_frameS7:upper_window_frame_pos7)-lower_window_rect_frameS7:lower_window_rect_frame_pos7", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 110, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS7-upper_window_frameS7:upper_window_frame_pos7", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos7", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos7", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1226}, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }] - }, - "fVolumes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "cave", - "fTitle" : "Top volume", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Magnet_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "Magnet", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Coil_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "Coil", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":849}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "copper", - "fTitle" : "", - "fId" : 2, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "copper", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 1, - "fA" : 63.54, - "fZ" : 29, - "fDensity" : 8.96, - "fRadLen" : 1.43502863740006, - "fIntLen" : 15.5141335257514, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 3, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, -85, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Coil_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1264}, - "fMother" : {"$ref":1261}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, 85, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Pole_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "Pole", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":882}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "iron", - "fTitle" : "", - "fId" : 3, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "iron", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 2, - "fA" : 55.847, - "fZ" : 26, - "fDensity" : 7.87, - "fRadLen" : 1.75762222730907, - "fIntLen" : 16.9675125483994, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 4, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c3", - "fTitle" : "", - "fTranslation" : [0, -84.25, 0], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Pole_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1271}, - "fMother" : {"$ref":1261}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c3", - "fTitle" : "", - "fTranslation" : [0, 84.25, 0], - "fRotation" : {"$ref":1275} - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Yoke_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Yoke", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 6, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":878}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 4, - "fBits" : 50331648, - "fName" : "steel", - "fTitle" : "", - "fId" : 4, - "fParams" : [0, 1, 30, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 4, - "fBits" : 50462720, - "fName" : "steel", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 3, - "fA" : 55.3021846147983, - "fZ" : 25.7733568999496, - "fDensity" : 8.02, - "fRadLen" : 1.73601610180003, - "fIntLen" : 16.5874229502559, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 5, - "fZmixture" : [25, 14, 24, 28, 26], - "fAmixture" : [54.938, 28.09, 51.996, 58.693, 55.85], - "fWeights" : [0.0199389542374542, 0.00509743005324265, 0.179276379064425, 0.106508886477384, 0.689178350167495], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 5, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":4} - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fVolume" : {"$ref":1261}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 2, - "fNtotal" : 6, - "fRefCount" : 7 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, 0, 124.5] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof700_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "tof700", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF2ChamberV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "TOF2GlassVolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":883}, - "fMedium" : {"$ref":1143}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 7, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":7} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2ActiveGasVolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 1, - "fBits" : 58736640, - "fName" : "ActiveGasStrip", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":884}, - "fMedium" : {"$ref":1092}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 32 - }, - "fMother" : {"$ref":1293}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -17.02578125, - "fIndex" : 0, - "fFinder" : { - "_typename" : "TGeoPatternY", - "fUniqueID" : 0, - "fBits" : 50331648, - "fStep" : 1.0984375, - "fStart" : -17.575, - "fEnd" : 17.575, - "fNdivisions" : 32, - "fDivIndex" : 0, - "fVolume" : {"$ref":1293} - } - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -15.92734375, - "fIndex" : 1, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -14.82890625, - "fIndex" : 2, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -13.73046875, - "fIndex" : 3, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -12.63203125, - "fIndex" : 4, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -11.53359375, - "fIndex" : 5, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -10.43515625, - "fIndex" : 6, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -9.33671875, - "fIndex" : 7, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -8.23828125, - "fIndex" : 8, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -7.13984375, - "fIndex" : 9, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -6.04140625, - "fIndex" : 10, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -4.94296875, - "fIndex" : 11, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -3.84453125, - "fIndex" : 12, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -2.74609375, - "fIndex" : 13, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -1.64765625, - "fIndex" : 14, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -0.549218749999998, - "fIndex" : 15, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 0.549218750000001, - "fIndex" : 16, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 1.64765625, - "fIndex" : 17, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 2.74609375, - "fIndex" : 18, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 3.84453125, - "fIndex" : 19, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 4.94296875, - "fIndex" : 20, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 6.04140625, - "fIndex" : 21, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 7.13984375, - "fIndex" : 22, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 8.23828125, - "fIndex" : 23, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 9.33671875, - "fIndex" : 24, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 10.43515625, - "fIndex" : 25, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 11.53359375, - "fIndex" : 26, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 12.63203125, - "fIndex" : 27, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 13.73046875, - "fIndex" : 28, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 14.82890625, - "fIndex" : 29, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 15.92734375, - "fIndex" : 30, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 17.02578125, - "fIndex" : 31, - "fFinder" : {"$ref":1297} - }] - }, - "fShape" : {"$ref":885}, - "fMedium" : {"$ref":1092}, - "fFinder" : {"$ref":1297}, - "fVoxels" : null, - "fNumber" : 9, - "fNtotal" : 33, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "GasLayerPosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -0.128] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV0_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1291}, - "fMother" : {"$ref":1288}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":8} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2G10VolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":886}, - "fMedium" : {"$ref":1148}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 10, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":9} - }] - }, - "fShape" : {"$ref":887}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "aluminium", - "fTitle" : "", - "fId" : 8, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "aluminium", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 7, - "fA" : 26.98, - "fZ" : 13, - "fDensity" : 2.7, - "fRadLen" : 8.87510465963777, - "fIntLen" : 38.8622319406182, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 11, - "fNtotal" : 37, - "fRefCount" : 25 - }, - "fMother" : {"$ref":1285}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_1_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [86.1, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_2_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [71.9, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_3_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [55.8, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_4_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.1, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_5_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [25.7, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_6_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.3, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_7_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [-4.5, 27.15, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_8_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [88.2, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_9_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [72.1, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_10_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [58, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_11_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.3, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_12_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [27.8, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_13_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [27.8, -3.55, 647] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_14_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.5, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_15_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [86, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_16_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [71.9, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_17_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [55.8, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_18_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.1, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_19_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [25.7, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_20_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.3, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_21_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [-4.5, -34.15, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF2ChamberV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "TOF2GlassVolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":888}, - "fMedium" : {"$ref":1143}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 12, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":7} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2ActiveGasVolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 1, - "fBits" : 58736640, - "fName" : "ActiveGasStrip", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":890}, - "fMedium" : {"$ref":1092}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 16 - }, - "fMother" : {"$ref":1382}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -14.2265625, - "fIndex" : 0, - "fFinder" : { - "_typename" : "TGeoPatternY", - "fUniqueID" : 0, - "fBits" : 50331648, - "fStep" : 1.896875, - "fStart" : -15.175, - "fEnd" : 15.175, - "fNdivisions" : 16, - "fDivIndex" : 0, - "fVolume" : {"$ref":1382} - } - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -12.3296875, - "fIndex" : 1, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -10.4328125, - "fIndex" : 2, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -8.5359375, - "fIndex" : 3, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -6.6390625, - "fIndex" : 4, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -4.7421875, - "fIndex" : 5, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -2.8453125, - "fIndex" : 6, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -0.948437499999999, - "fIndex" : 7, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 0.948437500000001, - "fIndex" : 8, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 2.8453125, - "fIndex" : 9, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 4.7421875, - "fIndex" : 10, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 6.6390625, - "fIndex" : 11, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 8.5359375, - "fIndex" : 12, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 10.4328125, - "fIndex" : 13, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 12.3296875, - "fIndex" : 14, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 14.2265625, - "fIndex" : 15, - "fFinder" : {"$ref":1386} - }] - }, - "fShape" : {"$ref":889}, - "fMedium" : {"$ref":1092}, - "fFinder" : {"$ref":1386}, - "fVoxels" : null, - "fNumber" : 13, - "fNtotal" : 17, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":1329} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV1_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1380}, - "fMother" : {"$ref":1377}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":8} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2G10VolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":891}, - "fMedium" : {"$ref":1148}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 14, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":9} - }] - }, - "fShape" : {"$ref":892}, - "fMedium" : {"$ref":1333}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 15, - "fNtotal" : 21, - "fRefCount" : 7 - }, - "fMother" : {"$ref":1285}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_22_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.3, 25.15, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1377}, - "fMother" : {"$ref":1285}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_23_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.5, -4.25, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1377}, - "fMother" : {"$ref":1285}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_24_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.3, -31.95, 597.1] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 82.001, - "fDY" : 52.126, - "fDZ" : 25.791, - "fOrigin" : [68, -3.4, 622.05], - "fVolume" : {"$ref":1285}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 6, - "fNtotal" : 841, - "fRefCount" : 26 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":842} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VETO_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "VETO", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VMDL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VFEL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VFEL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRFL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRFL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":898}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 15, - "fBits" : 50331648, - "fName" : "PLASTIC", - "fTitle" : "", - "fId" : 15, - "fParams" : [0, 1, 0.19, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 15, - "fBits" : 50462720, - "fName" : "PLASTIC", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 14, - "fA" : 11.158100787, - "fZ" : 5.61284345, - "fDensity" : 1.032, - "fRadLen" : 42.0401716084694, - "fIntLen" : 70.7393809758668, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.01, 1.008], - "fWeights" : [0.9225687, 0.07743125], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 21, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1418}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":11} - }] - }, - "fShape" : {"$ref":895}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 18, - "fNtotal" : 2, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":13} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VFEL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1418}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":14} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VSCL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRSL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRSL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":900}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 23, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1426}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":18} - }] - }, - "fShape" : {"$ref":897}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "PLASTIC", - "fTitle" : "", - "fId" : 13, - "fParams" : [1, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":1423} - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 20, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":17} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VPBL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRPL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRPL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":899}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 22, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1432}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":20} - }] - }, - "fShape" : {"$ref":896}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "LEAD", - "fTitle" : "", - "fId" : 14, - "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 10, - "fBits" : 50462720, - "fName" : "LEAD", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 9, - "fA" : 207.19, - "fZ" : 82, - "fDensity" : 11.35, - "fRadLen" : 0.561704911574565, - "fIntLen" : 18.2591661751475, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 19, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":19} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":24} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":25} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":28} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":29} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":32} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":33} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":36} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":37} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":40} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":41} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":44} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":45} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":48} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":49} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":52} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":53} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":56} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":57} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":60} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":61} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":64} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":65} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":68} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":69} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":72} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":73} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":76} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":77} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":80} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":81} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":84} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":85} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":88} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":89} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":92} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":93} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":96} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":97} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":100} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":101} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":104} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":105} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":108} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":109} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":112} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":113} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":116} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":117} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":120} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":121} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":124} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":125} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":128} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":129} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":132} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":133} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":136} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":137} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":140} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":141} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":144} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":145} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":148} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":149} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":152} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":153} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":156} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":157} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":160} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":161} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":164} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":165} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":168} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":169} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":172} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":173} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":176} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":177} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":180} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":181} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":184} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":185} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":188} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":189} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":192} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":193} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":196} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":197} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":200} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":201} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":204} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":205} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":208} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":209} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":212} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":213} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":216} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":217} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":220} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":221} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":224} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":225} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":228} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":229} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":232} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":233} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":236} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":237} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":240} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":241} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":244} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":245} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":248} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":249} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":252} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":253} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":256} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":257} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":260} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":261} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":264} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":265} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":268} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":269} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":272} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":273} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":276} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":277} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":280} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":281} - }] - }, - "fShape" : {"$ref":894}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 17, - "fNtotal" : 269, - "fRefCount" : 202 - }, - "fMother" : {"$ref":1412}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":284} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":285} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":286} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":287} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":288} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":289} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":290} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":291} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":292} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":293} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":294} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":295} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":296} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":297} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":298} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":299} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":300} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":301} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":302} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":303} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":304} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":305} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":306} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":307} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":308} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":309} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "UMDL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UFEL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "UFEL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "URFL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "URFL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":906}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 29, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1597}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":12} - }] - }, - "fShape" : {"$ref":905}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 28, - "fNtotal" : 2, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":15} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UFEL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1597}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":16} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "USCL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "URSL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "URSL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":903}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 26, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1603}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":22} - }] - }, - "fShape" : {"$ref":902}, - "fMedium" : {"$ref":1430}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 25, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":21} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "UPBL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":904}, - "fMedium" : {"$ref":1436}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 27, - "fNtotal" : 1, - "fRefCount" : 66 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":23} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":26} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":27} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":30} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":31} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":34} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":35} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":38} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":39} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":42} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":43} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":46} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":47} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":50} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":51} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":54} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":55} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":58} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":59} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":62} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":63} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":66} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":67} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":70} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":71} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":74} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":75} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":78} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":79} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":82} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":83} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":86} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":87} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":90} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":91} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":94} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":95} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":98} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":99} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":102} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":103} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":106} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":107} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":110} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":111} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":114} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":115} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":118} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":119} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":122} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":123} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":126} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":127} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":130} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":131} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":134} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":135} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":138} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":139} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":142} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":143} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":146} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":147} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":150} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":151} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":154} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":155} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":158} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":159} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":162} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":163} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":166} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":167} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":170} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":171} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":174} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":175} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":178} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":179} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":182} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":183} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":186} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":187} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":190} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":191} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":194} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":195} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":198} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":199} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":202} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":203} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":206} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":207} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":210} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":211} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":214} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":215} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":218} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":219} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":222} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":223} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":226} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":227} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":230} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":231} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":234} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":235} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":238} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":239} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":242} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":243} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":246} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":247} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":250} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":251} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":254} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":255} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":258} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":259} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":262} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":263} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":266} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":267} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":270} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":271} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":274} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":275} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":278} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":279} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":282} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":283} - }] - }, - "fShape" : {"$ref":901}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 24, - "fNtotal" : 203, - "fRefCount" : 166 - }, - "fMother" : {"$ref":1412}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":310} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":311} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":312} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":313} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":314} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":315} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":316} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":317} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":318} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":319} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":320} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":321} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":322} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":323} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":324} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":325} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":326} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":327} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":328} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":329} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":330} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":331} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":332} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":333} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":334} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":335} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":336} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":337} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":338} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":339} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":340} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":341} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":342} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":343} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":344} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":345} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":346} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":347} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":348} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":349} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":350} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":351} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":352} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":353} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":354} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":355} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":356} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":357} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":358} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":359} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":360} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":361} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":362} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":363} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":364} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":365} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":366} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":367} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":368} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":369} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":370} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":371} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":372} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":373} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":374} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":375} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":376} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":377} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":378} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":379} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":380} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":381} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":382} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":383} - }] - }, - "fShape" : {"$ref":893}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 9, - "fBits" : 50331648, - "fName" : "AIR", - "fTitle" : "", - "fId" : 9, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 11, - "fBits" : 50462720, - "fName" : "AIR", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 10, - "fA" : 14.61, - "fZ" : 7.3, - "fDensity" : 0.001205, - "fRadLen" : 30412.608512906, - "fIntLen" : 70037.7174700344, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 16, - "fNtotal" : 24789, - "fRefCount" : 101 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":10} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "GEMS_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "GEMS", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":940}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 32.7], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":960}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 64.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":980}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 96.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1010}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, -4.5, 128.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1043}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [0, -6.9, 161.1], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1076}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [0, -6.9, 193.1], - "fRotation" : null - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.55, - "fDZ" : 81.75, - "fOrigin" : [0, -6.6, 113.75], - "fVolume" : {"$ref":1815}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 30, - "fNtotal" : 57, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":838} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF400_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF400", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 54, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 27, 454.8] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 0, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -27, 454.8] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -54, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 54, 446.46] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 27, 442.6] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 0, 446.46] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -27, 442.6] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -54, 446.46] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 69, - "fDZ" : 9.53, - "fOrigin" : [54.4, 0, 450.63], - "fVolume" : {"$ref":1831}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 77, - "fNtotal" : 531, - "fRefCount" : 12 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "tw", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCH_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "DCH", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHDetV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "DCHDetV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "DCHActivePlaneV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1151}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 83, - "fNtotal" : 1, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1859}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":490} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":491} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":492} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":493} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":494} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":495} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":496} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":497} - }] - }, - "fShape" : {"$ref":1152}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 84, - "fNtotal" : 9, - "fRefCount" : 10 - }, - "fMother" : {"$ref":1856}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c485", - "fTitle" : "", - "fTranslation" : [0, 0, 514], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "rot", - "fTitle" : "", - "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHDetV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1859}, - "fMother" : {"$ref":1856}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 713], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "rot", - "fTitle" : "", - "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] - } - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 204.834692374119, - "fDY" : 204.834692374119, - "fDZ" : 112.75, - "fOrigin" : [0, 0, 613.5], - "fVolume" : {"$ref":1856}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 82, - "fNtotal" : 19, - "fRefCount" : 4 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":843} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPC_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "MWPC", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCContainerV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "MWPCContainerV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "MWPCActivePlaneV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1154}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 86, - "fNtotal" : 1, - "fRefCount" : 6 - }, - "fMother" : {"$ref":1880}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":498} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":499} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":501} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":503} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":505} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":507} - }] - }, - "fShape" : {"$ref":1153}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 87, - "fNtotal" : 7, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1877}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "DetPos0_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -362.41265] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCContainerV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1880}, - "fMother" : {"$ref":1877}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "DetPos1_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -212.63755] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 26.15396719429, - "fDY" : 26.15396719429, - "fDZ" : 78.39205, - "fOrigin" : [0, 0, -287.5251], - "fVolume" : {"$ref":1877}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 85, - "fNtotal" : 15, - "fRefCount" : 4 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":844} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01mod", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01front_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "ecal01front", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 6, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1157}, - "fMedium" : {"$ref":1280}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 90, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1897}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":511} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01lay", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lead_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "ecal01lead", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1159}, - "fMedium" : {"$ref":1430}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 92, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1902}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":513} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "ecal01scint", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1160}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 20, - "fBits" : 50331648, - "fName" : "FscScint", - "fTitle" : "", - "fId" : 20, - "fParams" : [1, 1, 20, -1, -1, -1, 1e-4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 20, - "fBits" : 50462720, - "fName" : "FscScint", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 19, - "fA" : 11.0715201827875, - "fZ" : 5.57349581111957, - "fDensity" : 1.032, - "fRadLen" : 42.1299811568047, - "fIntLen" : 70.0999370078305, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.01, 1.008], - "fWeights" : [0.914699162223915, 0.0853008377760853], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 93, - "fNtotal" : 1, - "fRefCount" : 9 - }, - "fMother" : {"$ref":1902}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":514} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":515} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":516} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":517} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":518} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":519} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":520} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":521} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":522} - }] - }, - "fShape" : {"$ref":1158}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 91, - "fNtotal" : 11, - "fRefCount" : 230 - }, - "fMother" : {"$ref":1897}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":512} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":523} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":524} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":525} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":526} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":527} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":528} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":529} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":530} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":531} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":532} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":533} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":534} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":535} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":536} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":537} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":538} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":539} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":540} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":541} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":542} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":543} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":544} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":545} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":546} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":547} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":548} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":549} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":550} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":551} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":552} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":553} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":554} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":555} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":556} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":557} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":558} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":559} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":560} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":561} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":562} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":563} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":564} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":565} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":566} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":567} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":568} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":569} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":570} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":571} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":572} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":573} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":574} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":575} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":576} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":577} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":578} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":579} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":580} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":581} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":582} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":583} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":584} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":585} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":586} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":587} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":588} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":589} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_69", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 69, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":590} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_70", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 70, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":591} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_71", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 71, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":592} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_72", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 72, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":593} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_73", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 73, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":594} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_74", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 74, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":595} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_75", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 75, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":596} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_76", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 76, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":597} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_77", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 77, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":598} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_78", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 78, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":599} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_79", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 79, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":600} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_80", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 80, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":601} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_81", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 81, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":602} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_82", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 82, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":603} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_83", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 83, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":604} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_84", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 84, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":605} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_85", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 85, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":606} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_86", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 86, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":607} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_87", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 87, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":608} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_88", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 88, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":609} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_89", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 89, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":610} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_90", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 90, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":611} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_91", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 91, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":612} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_92", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 92, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":613} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_93", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 93, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":614} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_94", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 94, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":615} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_95", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 95, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":616} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_96", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 96, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":617} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_97", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 97, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":618} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_98", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 98, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":619} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_99", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 99, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":620} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_100", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 100, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":621} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_101", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 101, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":622} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_102", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 102, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":623} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_103", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 103, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":624} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_104", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 104, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":625} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_105", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 105, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":626} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_106", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 106, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":627} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_107", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 107, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":628} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_108", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 108, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":629} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_109", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 109, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":630} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_110", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 110, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":631} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_111", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 111, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":632} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_112", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 112, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":633} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_113", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 113, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":634} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_114", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 114, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":635} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_115", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 115, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":636} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_116", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 116, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":637} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_117", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 117, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":638} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_118", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 118, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":639} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_119", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 119, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":640} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_120", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 120, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":641} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_121", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 121, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":642} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_122", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 122, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":643} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_123", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 123, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":644} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_124", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 124, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":645} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_125", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 125, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":646} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_126", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 126, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":647} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_127", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 127, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":648} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_128", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 128, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":649} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_129", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 129, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":650} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_130", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 130, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":651} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_131", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 131, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":652} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_132", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 132, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":653} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_133", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 133, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":654} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_134", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 134, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":655} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_135", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 135, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":656} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_136", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 136, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":657} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_137", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 137, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":658} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_138", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 138, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":659} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_139", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 139, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":660} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_140", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 140, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":661} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_141", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 141, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":662} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_142", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 142, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":663} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_143", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 143, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":664} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_144", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 144, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":665} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_145", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 145, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":666} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_146", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 146, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":667} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_147", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 147, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":668} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_148", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 148, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":669} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_149", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 149, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":670} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_150", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 150, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":671} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_151", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 151, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":672} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_152", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 152, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":673} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_153", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 153, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":674} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_154", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 154, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":675} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_155", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 155, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":676} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_156", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 156, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":677} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_157", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 157, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":678} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_158", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 158, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":679} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_159", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 159, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":680} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_160", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 160, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":681} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_161", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 161, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":682} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_162", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 162, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":683} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_163", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 163, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":684} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_164", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 164, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":685} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_165", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 165, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":686} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_166", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 166, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":687} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_167", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 167, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":688} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_168", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 168, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":689} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_169", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 169, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":690} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_170", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 170, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":691} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_171", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 171, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":692} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_172", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 172, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":693} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_173", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 173, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":694} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_174", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 174, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":695} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_175", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 175, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":696} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_176", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 176, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":697} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_177", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 177, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":698} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_178", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 178, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":699} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_179", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 179, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":700} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_180", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 180, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":701} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_181", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 181, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":702} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_182", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 182, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":703} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_183", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 183, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":704} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_184", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 184, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":705} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_185", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 185, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":706} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_186", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 186, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":707} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_187", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 187, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":708} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_188", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 188, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":709} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_189", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 189, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":710} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_190", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 190, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":711} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_191", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 191, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":712} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_192", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 192, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":713} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_193", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 193, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":714} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_194", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 194, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":715} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_195", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 195, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":716} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_196", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 196, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":717} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_197", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 197, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":718} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_198", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 198, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":719} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_199", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 199, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":720} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_200", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 200, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":721} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_201", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 201, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":722} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_202", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 202, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":723} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_203", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 203, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":724} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_204", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 204, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":725} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_205", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 205, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":726} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_206", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 206, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":727} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_207", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 207, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":728} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_208", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 208, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":729} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_209", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 209, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":730} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_210", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 210, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":731} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_211", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 211, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":732} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_212", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 212, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":733} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_213", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 213, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":734} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_214", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 214, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":735} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_215", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 215, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":736} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_216", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 216, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":737} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_217", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 217, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":738} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_218", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 218, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":739} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_219", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 219, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":740} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_220", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 220, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":741} - }] - }, - "fShape" : {"$ref":1156}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 89, - "fNtotal" : 2422, - "fRefCount" : 301 - }, - "fMother" : {"$ref":1894}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":510} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":742} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":743} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":744} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":745} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":746} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":747} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":748} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":749} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":750} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":751} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":752} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":753} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":754} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":755} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":756} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":757} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":758} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":759} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":760} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":761} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":762} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":763} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":764} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":765} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":766} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":767} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":768} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":769} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":770} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":771} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":772} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":773} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":774} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":775} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":776} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":777} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":778} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":779} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":780} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":781} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":782} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":783} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":784} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":785} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":786} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":787} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":788} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":789} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":790} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":791} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":792} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":793} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":794} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":795} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":796} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":797} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":798} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":799} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":800} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":801} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":802} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":803} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":804} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":805} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":806} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":807} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":808} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_69", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 69, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":809} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_70", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 70, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":810} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_71", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 71, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":811} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_72", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 72, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":812} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_73", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 73, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":813} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_74", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 74, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":814} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_75", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 75, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":815} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_76", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 76, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":816} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_77", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 77, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":817} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_78", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 78, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":818} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_79", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 79, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":819} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_80", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 80, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":820} - }] - }, - "fShape" : {"$ref":1155}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 88, - "fNtotal" : 193761, - "fRefCount" : 82 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":509} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1894}, - "fMother" : {"$ref":1258}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":821} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Silicon_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "Silicon", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1233}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "silicon", - "fTitle" : "", - "fId" : 21, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "silicon", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 20, - "fA" : 28.0855, - "fZ" : 14, - "fDensity" : 2.33, - "fRadLen" : 9.34960746942193, - "fIntLen" : 45.753205754866, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2224}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":822} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1234}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2224}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":823} - }] - }, - "fShape" : {"$ref":1235}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 97, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c812", - "fTitle" : "", - "fTranslation" : [9, 6.15175, 3.325], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1161}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 98, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c814", - "fTitle" : "", - "fTranslation" : [9, 6.15175, 3.22], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1238}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2239}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":824} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1236}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2239}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":825} - }] - }, - "fShape" : {"$ref":1237}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 100, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c814", - "fTitle" : "", - "fTranslation" : [3, 6.15175, 1.795], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1170}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c816", - "fTitle" : "", - "fTranslation" : [3, 6.15175, 1.69], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_2_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1240}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2252}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":826} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1241}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2252}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":827} - }] - }, - "fShape" : {"$ref":1239}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 101, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [-3, 6.15175, 3.105], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1179}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [-3, 6.15175, 3.21], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_3_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1243}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2263}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":828} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1244}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2263}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":829} - }] - }, - "fShape" : {"$ref":1242}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 102, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [-9, 6.15175, 1.575], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1188}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [-9, 6.15175, 1.68], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_4_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1246}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2274}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":830} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1247}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2274}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":831} - }] - }, - "fShape" : {"$ref":1245}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 103, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c820", - "fTitle" : "", - "fTranslation" : [9, -6.15175, 2.065], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1197}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c822", - "fTitle" : "", - "fTranslation" : [9, -6.15175, 2.17], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_5_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1249}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2287}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":832} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1250}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2287}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":833} - }] - }, - "fShape" : {"$ref":1248}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 104, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c822", - "fTitle" : "", - "fTranslation" : [3, -6.15175, 3.595], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1206}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c824", - "fTitle" : "", - "fTranslation" : [3, -6.15175, 3.7], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_6_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1252}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2300}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":834} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1253}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2300}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":835} - }] - }, - "fShape" : {"$ref":1251}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 105, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c824", - "fTitle" : "", - "fTranslation" : [-3, -6.15175, 2.285], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1215}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c826", - "fTitle" : "", - "fTranslation" : [-3, -6.15175, 2.18], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_7_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1255}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2313}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":836} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1256}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2313}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":837} - }] - }, - "fShape" : {"$ref":1254}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 106, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c826", - "fTitle" : "", - "fTranslation" : [-9, -6.15175, 3.815], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1224}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c828", - "fTitle" : "", - "fTranslation" : [-9, -6.15175, 3.71], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 12.15, - "fDY" : 12.4535, - "fDZ" : 1.135, - "fOrigin" : [0, 0, 2.695], - "fVolume" : {"$ref":2221}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 3, - "fNtotal" : 33, - "fRefCount" : 17 - }, - "fMother" : {"$ref":2218}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, -4.5, 0] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 12.15, - "fDY" : 12.4535, - "fDZ" : 1.135, - "fOrigin" : [0, -4.5, 2.695], - "fVolume" : {"$ref":2218}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 94, - "fNtotal" : 34, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":839} - }] - }, - "fShape" : {"$ref":848}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 1, - "fNtotal" : 413815, - "fRefCount" : 10 - }, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1385}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2242}, {"$ref":2252}, {"$ref":2255}, {"$ref":2257}, {"$ref":2263}, {"$ref":2266}, {"$ref":2268}, {"$ref":2274}, {"$ref":2277}, {"$ref":2279}, {"$ref":2287}, {"$ref":2290}, {"$ref":2292}, {"$ref":2300}, {"$ref":2303}, {"$ref":2305}, {"$ref":2313}, {"$ref":2316}, {"$ref":2318}] - }, - "fPhysicalNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fTracks" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fPdgNames" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "d", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "d_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "u", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "u_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "s", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "s_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b'_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t'_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "e-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "e+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_e", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_e_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "mu-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "mu+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_mu", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_mu_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_tau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_tau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau'-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau'+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu'_tau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu'_tau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "g", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "gamma", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "h0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "reggeon", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pomeron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z'0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z\"0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W'+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W'-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "A0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "LQ_ue", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "LQ_ue_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "R0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "R0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi'_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega_tech", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_L++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_L--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_R++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_R--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W_R+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W_R-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Re", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Re_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rmu", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rmu_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rtau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rtau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "specflav", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rndmflav", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rndmflav_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phasespa", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c-hadron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c-hadron_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b-hadron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b-hadron_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cluster", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "string", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "indep.", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CMshower", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "SPHEaxis", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "THRUaxis", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CLUSjet", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CELLjet", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "table", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_diff0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K_L0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_diffr+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_diffr-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega_di", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "f_2", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K_S0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phi_diff", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phi", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "f'_2", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D_s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D_s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "J\/psi_di", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "J\/psi", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "chi_2c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Upsilon", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "chi_2b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "dd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "dd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "n_diffr0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "n_diffr0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "neutron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "antineutron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "uu_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "uu_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "p_diffr+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "p_diffr+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "proton", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "antiproton", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ss_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ss_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Omega-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Omega+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c-", - "fTitle" : "" - }] - }, - "fMaterials" : { - "_typename" : "TList", - "name" : "THashList", - "arr" : [{"$ref":938}, {"$ref":1266}, {"$ref":1273}, {"$ref":1281}, {"$ref":1144}, {"$ref":1093}, {"$ref":1149}, {"$ref":1334}, {"$ref":945}, {"$ref":1437}, {"$ref":1813}, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "VACUUM", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 11, - "fA" : 0, - "fZ" : 0, - "fDensity" : 0, - "fRadLen" : 1e30, - "fIntLen" : 1e30, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "SILICON", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 12, - "fA" : 28.09, - "fZ" : 14, - "fDensity" : 2.33, - "fRadLen" : 9.35110551053256, - "fIntLen" : 45.753205754866, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, {"$ref":930}, {"$ref":1423}, { - "_typename" : "TGeoMixture", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TYVEC", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 15, - "fA" : 10.4296180316, - "fZ" : 5.281386, - "fDensity" : 0.93, - "fRadLen" : 47.5076063184073, - "fIntLen" : 72.8965033104632, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.011, 1.008], - "fWeights" : [0.8562772, 0.1437228], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - }, {"$ref":965}, {"$ref":935}, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "lead", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 18, - "fA" : 207.1, - "fZ" : 82, - "fDensity" : 11.34, - "fRadLen" : 0.561956031451292, - "fIntLen" : 18.2752677326212, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, {"$ref":1909}, {"$ref":2229}], - "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] - }, - "fMedia" : { - "_typename" : "TList", - "name" : "THashList", - "arr" : [{"$ref":937}, {"$ref":1265}, {"$ref":1272}, {"$ref":1280}, {"$ref":1143}, {"$ref":1092}, {"$ref":1148}, {"$ref":1333}, {"$ref":1812}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 10, - "fBits" : 50331648, - "fName" : "VACUUM", - "fTitle" : "", - "fId" : 10, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2589} - }, {"$ref":944}, {"$ref":929}, {"$ref":1430}, {"$ref":1436}, {"$ref":1422}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TYVEC", - "fTitle" : "", - "fId" : 16, - "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2591} - }, {"$ref":964}, {"$ref":934}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "lead", - "fTitle" : "", - "fId" : 19, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2592} - }, {"$ref":1908}, {"$ref":2228}], - "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] - }, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cave_1", - "fTitle" : "Top logical node", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1258}, - "fMother" : null, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":2} - }] - }, - "fOverlaps" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fRegions" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fMasterVolume" : {"$ref":1258}, - "fGLMatrix" : { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, - "fUniqueVolumes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{"$ref":1258}, {"$ref":1258}, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2252}, {"$ref":2263}, {"$ref":2274}, {"$ref":2287}, {"$ref":2300}, {"$ref":2313}] - }, - "fNLevel" : 100, - "fHashPNE" : { - "_typename" : "THashList", - "name" : "THashList", - "arr" : [], - "opt" : [] - }, - "fSizePNEId" : 0, - "fNPNEId" : 0, - "fKeyPNEId" : [], - "fValuePNEId" : [], - "fUsePWNav" : false, - "fParallelWorld" : null -} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip b/demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip new file mode 100644 index 0000000000000000000000000000000000000000..47701be0b5a9ea2751ef0e50cad6d2b13eb2445e GIT binary patch literal 84791 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 +public val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> flexColumn { flexRow { css { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt index dca591fe..b37637fe 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt @@ -5,7 +5,6 @@ import kotlinx.html.DIV import kotlinx.html.id import kotlinx.html.js.onClickFunction import react.RBuilder -import react.ReactElement import react.dom.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -16,7 +15,7 @@ import styled.styledDiv import styled.styledNav -public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuilder

.() -> Unit): ReactElement = +public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuilder
.() -> Unit): Unit = styledDiv { css { +"card" @@ -36,7 +35,7 @@ public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuild public fun RBuilder.accordion( id: String, elements: List.() -> Unit>>, -): ReactElement = styledDiv { +): Unit = styledDiv { css { +"accordion" //+"p-1" @@ -82,7 +81,7 @@ public fun RBuilder.accordion( } -public fun RBuilder.nameCrumbs(name: Name?, rootTitle: String, link: (Name) -> Unit): ReactElement = styledNav { +public fun RBuilder.nameCrumbs(name: Name?, rootTitle: String, link: (Name) -> Unit): Unit = styledNav { css { +"p-0" } @@ -127,9 +126,9 @@ public fun RSectionsBuilder.entry(title: String, builder: StyledDOMBuilder
. add(title to builder) } -public fun RBuilder.accordion(id: String, builder: RSectionsBuilder.() -> Unit): ReactElement { +public fun RBuilder.accordion(id: String, builder: RSectionsBuilder.() -> Unit): Unit { val list = ArrayList.() -> Unit>>().apply(builder) - return accordion(id, list) + accordion(id, list) } public enum class ContainerSize(public val suffix: String) { @@ -144,7 +143,7 @@ public enum class ContainerSize(public val suffix: String) { public inline fun RBuilder.container( size: ContainerSize = ContainerSize.FLUID, block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { css { classes.add("container${size.suffix}") } @@ -164,7 +163,7 @@ public inline fun RBuilder.gridColumn( weight: Int? = null, maxSize: GridMaxSize = GridMaxSize.NONE, block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { val weightSuffix = weight?.let { "-$it" } ?: "" css { classes.add("col${maxSize.suffix}$weightSuffix") @@ -174,7 +173,7 @@ public inline fun RBuilder.gridColumn( public inline fun RBuilder.gridRow( block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { css { classes.add("row") } diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index 987dbc0e..fc58fed7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -12,22 +12,22 @@ import space.kscience.visionforge.react.flexColumn import styled.StyledDOMBuilder import styled.styledDiv -public external class TabProps : RProps { +public external interface TabProps : PropsWithChildren { public var id: String public var title: String? } @JsExport -public val Tab: FunctionComponent = functionalComponent { props -> +public val Tab: FunctionComponent = functionComponent { props -> props.children() } -public external class TabPaneProps : RProps { +public external interface TabPaneProps : PropsWithChildren { public var activeTab: String? } @JsExport -public val TabPane: FunctionComponent = functionalComponent("TabPane") { props -> +public val TabPane: FunctionComponent = functionComponent("TabPane") { props -> var activeTab: String? by useState(props.activeTab) val children: Array = Children.map(props.children) { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index 95219db1..deacc025 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -2,8 +2,11 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border -import react.* +import react.FunctionComponent +import react.RBuilder +import react.RProps import react.dom.h2 +import react.functionComponent import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision @@ -21,7 +24,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionComponent { props -> tabPane(if (props.selected != null) "Properties" else null) { tab("Canvas") { card("Canvas configuration") { @@ -67,7 +70,7 @@ public fun RBuilder.threeControls( selected: Name?, onSelect: (Name) -> Unit = {}, builder: TabBuilder.() -> Unit = {}, -): ReactElement = child(ThreeControls) { +): Unit = child(ThreeControls) { attrs { this.canvasOptions = canvasOptions this.vision = vision diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 69683bc5..ed51f566 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -42,7 +42,7 @@ public external interface MetaViewerProps : RProps { public var descriptor: MetaDescriptor? } -private val MetaViewerItem: FunctionComponent = functionalComponent("MetaViewerItem") { props -> +private val MetaViewerItem: FunctionComponent = functionComponent("MetaViewerItem") { props -> metaViewerItem(props) } @@ -127,17 +127,16 @@ private fun RBuilder.metaViewerItem(props: MetaViewerProps) { } @JsExport -public val MetaViewer: FunctionComponent = - functionalComponent("MetaViewer") { props -> - child(MetaViewerItem) { - attrs { - this.key = "" - this.root = props.root - this.name = Name.EMPTY - this.descriptor = props.descriptor - } +public val MetaViewer: FunctionComponent = functionComponent("MetaViewer") { props -> + child(MetaViewerItem) { + attrs { + this.key = "" + this.root = props.root + this.name = Name.EMPTY + this.descriptor = props.descriptor } } +} public fun RBuilder.metaViewer(meta: Meta, descriptor: MetaDescriptor? = null, key: Any? = null) { child(MetaViewer) { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 84181340..45a98abd 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -9,14 +9,14 @@ import react.FunctionComponent import react.dom.attrs import react.dom.option import react.dom.select -import react.functionalComponent +import react.functionComponent import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @JsExport public val MultiSelectChooser: FunctionComponent = - functionalComponent("MultiSelectChooser") { props -> + functionComponent("MultiSelectChooser") { props -> val onChange: (Event) -> Unit = { event: Event -> val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 9ff77f2c..ea643813 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -48,7 +48,7 @@ public external interface PropertyEditorProps : RProps { } private val PropertyEditorItem: FunctionComponent = - functionalComponent("PropertyEditorItem") { props -> + functionComponent("PropertyEditorItem") { props -> propertyEditorItem(props) } @@ -193,7 +193,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } @JsExport -public val PropertyEditor: FunctionComponent = functionalComponent("PropertyEditor") { props -> +public val PropertyEditor: FunctionComponent = functionComponent("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index c753271f..bda76147 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -8,7 +8,7 @@ import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event import react.FunctionComponent import react.dom.attrs -import react.functionalComponent +import react.functionComponent import react.useState import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double @@ -20,7 +20,7 @@ import styled.styledInput @JsExport public val RangeValueChooser: FunctionComponent = - functionalComponent("RangeValueChooser") { props -> + functionComponent("RangeValueChooser") { props -> var innerValue by useState(props.actual.double) var rangeDisabled: Boolean by useState(props.meta.value == null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 6be75689..b78ec7d9 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -21,7 +21,7 @@ public external interface ThreeCanvasProps : RProps { public var selected: Name? } -public val ThreeCanvasComponent: FunctionComponent = functionalComponent( +public val ThreeCanvasComponent: FunctionComponent = functionComponent( "ThreeCanvasComponent" ) { props -> val elementRef = useRef(null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index d746e14a..5fa44bfd 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -28,7 +28,7 @@ public external interface ObjectTreeProps : RProps { public var clickCallback: (Name) -> Unit } -private val TreeLabel = functionalComponent { props -> +private val TreeLabel = functionComponent { props -> val token = useMemo(props.name) { props.name.lastOrNull()?.toString() ?: "World" } styledSpan { css { @@ -107,7 +107,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } @JsExport -public val ObjectTree: FunctionComponent = functionalComponent("ObjectTree") { props -> +public val ObjectTree: FunctionComponent = functionComponent("ObjectTree") { props -> visionTree(props) } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt index e8d928f5..11a13561 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt @@ -6,14 +6,13 @@ import kotlinx.css.display import kotlinx.css.flexDirection import kotlinx.html.DIV import react.RBuilder -import react.ReactElement import styled.StyledDOMBuilder import styled.css import styled.styledDiv public inline fun RBuilder.flexColumn( block: StyledDOMBuilder
.() -> Unit -): ReactElement = styledDiv { +): Unit = styledDiv { css { display = Display.flex flexDirection = FlexDirection.column @@ -23,7 +22,7 @@ public inline fun RBuilder.flexColumn( public inline fun RBuilder.flexRow( block: StyledDOMBuilder
.() -> Unit -): ReactElement = styledDiv { +): Unit = styledDiv { css { display = Display.flex flexDirection = FlexDirection.row diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 711710f6..cd686498 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -10,9 +10,12 @@ import kotlinx.html.js.onKeyDownFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event -import react.* +import react.FunctionComponent +import react.RProps import react.dom.attrs import react.dom.option +import react.functionComponent +import react.useState import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.allowedValues @@ -34,7 +37,7 @@ public external interface ValueChooserProps : RProps { @JsExport public val StringValueChooser: FunctionComponent = - functionalComponent("StringValueChooser") { props -> + functionComponent("StringValueChooser") { props -> var value by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { @@ -59,7 +62,7 @@ public val StringValueChooser: FunctionComponent = @JsExport public val BooleanValueChooser: FunctionComponent = - functionalComponent("BooleanValueChooser") { props -> + functionComponent("BooleanValueChooser") { props -> val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).checked props.meta.value = newValue.asValue() @@ -78,7 +81,7 @@ public val BooleanValueChooser: FunctionComponent = @JsExport public val NumberValueChooser: FunctionComponent = - functionalComponent("NumberValueChooser") { props -> + functionComponent("NumberValueChooser") { props -> var innerValue by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { @@ -117,7 +120,7 @@ public val NumberValueChooser: FunctionComponent = @JsExport public val ComboValueChooser: FunctionComponent = - functionalComponent("ComboValueChooser") { props -> + functionComponent("ComboValueChooser") { props -> var selected by useState(props.actual.string ?: "") val handleChange: (Event) -> Unit = { selected = (it.target as HTMLSelectElement).value @@ -142,7 +145,7 @@ public val ComboValueChooser: FunctionComponent = @JsExport public val ColorValueChooser: FunctionComponent = - functionalComponent("ColorValueChooser") { props -> + functionComponent("ColorValueChooser") { props -> val handleChange: (Event) -> Unit = { props.meta.value = (it.target as HTMLInputElement).value.asValue() } @@ -162,7 +165,7 @@ public val ColorValueChooser: FunctionComponent = } @JsExport -public val ValueChooser: FunctionComponent = functionalComponent("ValueChooser") { props -> +public val ValueChooser: FunctionComponent = functionComponent("ValueChooser") { props -> val rawInput by useState(false) val descriptor = props.descriptor diff --git a/ui/ring/src/main/kotlin/ringui/Loader.kt b/ui/ring/src/main/kotlin/ringui/Loader.kt index c58d51c1..b7bc63a9 100644 --- a/ui/ring/src/main/kotlin/ringui/Loader.kt +++ b/ui/ring/src/main/kotlin/ringui/Loader.kt @@ -4,10 +4,11 @@ package ringui import react.ComponentClass -import react.dom.WithClassName +import react.PropsWithClassName + // https://github.com/JetBrains/ring-ui/blob/master/components/loader/loader.js -public external interface LoaderProps : WithClassName { +public external interface LoaderProps : PropsWithClassName { public var size: Number public var colors: Array public var message: String diff --git a/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt index 8d0bf578..d662ee2b 100644 --- a/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt +++ b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt @@ -4,10 +4,10 @@ package ringui import react.ComponentClass -import react.dom.WithClassName +import react.PropsWithClassName // https://github.com/JetBrains/ring-ui/blob/master/components/loader-screen/loader-screen.js -public external interface LoaderScreenProps : WithClassName { +public external interface LoaderScreenProps : PropsWithClassName { public var containerClassName: String public var message: String } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 94f02fdd..03420cba 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -43,7 +43,7 @@ public fun ThreeCanvasWithControlsProps.tab(title: String, block: RBuilder.() -> } -public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement = styledDiv { +public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styledDiv { div { Link { attrs { @@ -77,7 +77,7 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement @JsExport public val ThreeCanvasWithControls: FunctionComponent = - functionalComponent("ThreeViewWithControls") { props -> + functionComponent("ThreeViewWithControls") { props -> var selected by useState { props.selected } var solid: Solid? by useState(null) diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 016ce4e0..46543106 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -9,9 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.* +import react.FunctionComponent +import react.RBuilder +import react.RProps import react.dom.attrs import react.dom.button +import react.functionComponent import ringui.Island import ringui.SmartTabs import ringui.Tab @@ -35,8 +38,8 @@ internal fun saveData(event: Event, fileName: String, mimeType: String = "text/p fileSaver.saveAs(blob, fileName) } -internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): ReactElement { - return child(CanvasControls) { +internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): Unit { + child(CanvasControls) { attrs { this.options = options this.vision = vision @@ -49,7 +52,7 @@ internal external interface CanvasControlsProps : RProps { public var vision: Vision? } -internal val CanvasControls: FunctionComponent = functionalComponent("CanvasControls") { props -> +internal val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> flexColumn { flexRow { css { @@ -91,7 +94,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionComponent { props -> SmartTabs("Tree") { props.vision?.let { Tab("Tree") { @@ -119,7 +122,7 @@ public fun RBuilder.ringThreeControls( selected: Name?, onSelect: (Name?) -> Unit = {}, additionalTabs: Map Unit>? = null -): ReactElement = child(ThreeControls) { +): Unit = child(ThreeControls) { attrs { this.canvasOptions = canvasOptions this.vision = vision -- 2.34.1 From dee2cf848ca1709e053cc71ab9fef1aef3c0aeba Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 14 Sep 2021 16:30:18 +0300 Subject: [PATCH 039/143] Minor adjustment to root conversion --- .../kotlin/ru/mipt/npm/root/DObject.kt | 6 +-- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 54 ++++++++----------- .../visionforge-gdml-jupyter/build.gradle.kts | 8 +-- settings.gradle.kts | 2 +- 4 files changed, 27 insertions(+), 43 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 9f4d1971..5af50c3f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -25,7 +25,7 @@ public class DObjectCache(private val cache: List, public val refStack: Li } } -public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { +public open class DObject(public val meta: Meta, public val refCache: DObjectCache) { public val typename: String by meta.string(key = "_typename".asName()) { error("Type is not defined") @@ -85,10 +85,6 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fFillColor: Int? by meta.int() override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } - - public val numberOfChildren: Int by lazy { - fNodes.sumOf { (it.fVolume?.numberOfChildren ?: 0) + 1 } - } } public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index a11f1996..7c345dd4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -17,16 +17,11 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class RootToSolidContext(val prototypeHolder: PrototypeHolder, val maxLayer: Int = 3) { - val layers: MutableList = mutableListOf(0) - - val layerLimits = listOf(10_000, 25_000, 50_000, 100_000, 200_000, 400_000, 600_000) - - val bottomLayer: Int get() = layers.size - 1 - fun addLayer() { - layers.add(0) - } -} +private data class RootToSolidContext( + val prototypeHolder: PrototypeHolder, + val currentLayer: Int = 0, + val maxLayer: Int = 5 +) // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix private fun Solid.rotate(rot: DoubleArray) { @@ -267,9 +262,6 @@ private fun SolidGroup.addShape( private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { val volume = obj.fVolume ?: return addRootVolume(volume, context, obj.fName) { - if (context.bottomLayer > 0) { - this.layer = context.bottomLayer - } when (obj.typename) { "TGeoNodeMatrix" -> { val fMatrix by obj.dObject(::DGeoMatrix) @@ -285,22 +277,28 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { val group = SolidGroup { - val nodesNum = volume.fNodes.size - if (nodesNum == 0) { + //set current layer + layer = context.currentLayer + val nodes = volume.fNodes + + if (nodes.isEmpty() || context.currentLayer >= context.maxLayer) { //TODO add smart filter volume.fShape?.let { shape -> addShape(shape, context) } - } - val expectedLayerSize = context.layers.last() + nodesNum - //If expected number exceeds layer limit, move everything else to the bottom layer. - if (expectedLayerSize >= context.layerLimits[context.bottomLayer]) { - context.addLayer() - println("Adding new layer. Sizes after add: ${context.layers}") - } - context.layers[context.bottomLayer] += nodesNum - volume.fNodes.forEach { node -> - addRootNode(node, context) + } else { + val newLayer = if (nodes.size <= 2) { + context.currentLayer + } else if (nodes.size > 10) { + context.currentLayer + 2 + } else { + context.currentLayer + 1 + } + val newContext = context.copy(currentLayer = newLayer) + nodes.forEach { node -> + //add children to the next layer + addRootNode(node, newContext) + } } } return if (group.isEmpty()) { @@ -321,12 +319,6 @@ private fun SolidGroup.addRootVolume( cache: Boolean = true, block: Solid.() -> Unit = {} ) { - //skip if maximum layer number is reached - if (context.bottomLayer > context.maxLayer) { - println("Maximum layer depth reached. Skipping ${volume.fName}") - return - } - val combinedName = if (volume.fName.isEmpty()) { name } else if (name == null) { diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-gdml-jupyter/build.gradle.kts index 6c1d7c43..c2c77516 100644 --- a/jupyter/visionforge-gdml-jupyter/build.gradle.kts +++ b/jupyter/visionforge-gdml-jupyter/build.gradle.kts @@ -51,13 +51,9 @@ kotlin { } kscience { - useJupyter() + jupyterLibrary("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") } readme { maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL -} - -tasks.named("processJupyterApiResources") { - libraryProducers = listOf("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") -} +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index ad1b4aef..a6f4db0d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ pluginManagement { val toolsVersion = "0.10.3" repositories { - mavenLocal() + //mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() -- 2.34.1 From 9eb5def13c4579164a1f9c43c07259244086a689 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 28 Sep 2021 12:27:58 +0000 Subject: [PATCH 040/143] Build --- .space.kts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .space.kts diff --git a/.space.kts b/.space.kts new file mode 100644 index 00000000..45b2ed53 --- /dev/null +++ b/.space.kts @@ -0,0 +1,4 @@ +job("Build") { + gradlew("openjdk:11", "build") +} + -- 2.34.1 From b40c1d0025a010f9f5139706e3017d0c5da9cb44 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 23 Nov 2021 17:51:47 +0300 Subject: [PATCH 041/143] Update kotlin and DF --- build.gradle.kts | 4 ++-- demo/playground/src/jvmMain/kotlin/rootParser.kt | 1 - settings.gradle.kts | 2 +- .../space/kscience/visionforge/bootstrap/outputConfig.kt | 6 +++--- .../space/kscience/visionforge/bootstrap/threeControls.kt | 4 ++-- .../kotlin/space/kscience/visionforge/react/MetaViewer.kt | 2 +- .../space/kscience/visionforge/react/PropertyEditor.kt | 2 +- .../kscience/visionforge/react/ThreeCanvasComponent.kt | 2 +- .../kotlin/space/kscience/visionforge/react/VisionTree.kt | 2 +- .../kotlin/space/kscience/visionforge/react/valueChooser.kt | 4 ++-- .../ThreeViewWithControls.kt | 2 +- .../space.kscience.visionforge.ring/ringThreeControls.kt | 6 +++--- .../kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt | 1 + .../kotlin/space/kscience/visionforge/solid/Composite.kt | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4ad95112..5c776dad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.1") +val dataforgeVersion by extra("0.5.2-dev-2") val fxVersion by extra("11") allprojects { @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-24" + version = "0.2.0-dev-25" } subprojects { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 80555bc5..afe8528f 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -40,7 +40,6 @@ fun main() { println(it) } - val solid = geo.toSolid() Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) diff --git a/settings.gradle.kts b/settings.gradle.kts index a6f4db0d..4cdc6b82 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { - val toolsVersion = "0.10.3" + val toolsVersion = "0.10.7" repositories { //mavenLocal() diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 7df93784..b20e2b0e 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -10,8 +10,8 @@ import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FunctionComponent +import react.Props import react.RBuilder -import react.RProps import react.dom.attrs import react.dom.button import react.functionComponent @@ -42,7 +42,7 @@ public fun RBuilder.canvasControls(canvasOptions: Canvas3DOptions, vision: Visio } } -public external interface CanvasControlsProps : RProps { +public external interface CanvasControlsProps : Props { public var canvasOptions: Canvas3DOptions public var vision: Vision? } @@ -54,7 +54,7 @@ public val CanvasControls: FunctionComponent = functionComp border(1.px, BorderStyle.solid, Color.blue) padding(4.px) } - props.vision?.let{ vision -> + props.vision?.let { vision -> button { +"Export" attrs { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index deacc025..deda16d7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -3,8 +3,8 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border import react.FunctionComponent +import react.PropsWithChildren import react.RBuilder -import react.RProps import react.dom.h2 import react.functionComponent import space.kscience.dataforge.names.Name @@ -16,7 +16,7 @@ import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv -public external interface ThreeControlsProps : RProps { +public external interface ThreeControlsProps : PropsWithChildren { public var canvasOptions: Canvas3DOptions public var vision: Vision? public var selected: Name? diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index ed51f566..7d41bde9 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -20,7 +20,7 @@ import styled.css import styled.styledDiv import styled.styledSpan -public external interface MetaViewerProps : RProps { +public external interface MetaViewerProps : Props { /** * Root meta */ diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index ea643813..4264b77f 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -19,7 +19,7 @@ import styled.styledButton import styled.styledDiv import styled.styledSpan -public external interface PropertyEditorProps : RProps { +public external interface PropertyEditorProps : Props { /** * Root config object - always non-null diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index b78ec7d9..319a867c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -14,7 +14,7 @@ import space.kscience.visionforge.solid.three.ThreePlugin import styled.css import styled.styledDiv -public external interface ThreeCanvasProps : RProps { +public external interface ThreeCanvasProps : Props { public var context: Context public var options: Canvas3DOptions? public var solid: Solid? diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 5fa44bfd..539fa2ee 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -21,7 +21,7 @@ import styled.css import styled.styledDiv import styled.styledSpan -public external interface ObjectTreeProps : RProps { +public external interface ObjectTreeProps : Props { public var name: Name public var selected: Name? public var obj: Vision diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index cd686498..1296d777 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -11,7 +11,7 @@ import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event import react.FunctionComponent -import react.RProps +import react.Props import react.dom.attrs import react.dom.option import react.functionComponent @@ -29,7 +29,7 @@ import styled.css import styled.styledInput import styled.styledSelect -public external interface ValueChooserProps : RProps { +public external interface ValueChooserProps : Props { public var descriptor: MetaDescriptor? public var meta: ObservableMutableMeta public var actual: Meta diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 03420cba..5dd44099 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -24,7 +24,7 @@ import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv -public external interface ThreeCanvasWithControlsProps : RProps { +public external interface ThreeCanvasWithControlsProps : Props { public var context: Context public var builderOfSolid: Deferred public var selected: Name? diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 46543106..eed656e6 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -10,8 +10,8 @@ import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FunctionComponent +import react.Props import react.RBuilder -import react.RProps import react.dom.attrs import react.dom.button import react.functionComponent @@ -47,7 +47,7 @@ internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): } } -internal external interface CanvasControlsProps : RProps { +internal external interface CanvasControlsProps : Props { public var options: Canvas3DOptions public var vision: Vision? } @@ -85,7 +85,7 @@ internal val CanvasControls: FunctionComponent = functionCo } -public external interface ThreeControlsProps : RProps { +public external interface ThreeControlsProps : Props { public var canvasOptions: Canvas3DOptions public var vision: Vision? public var selected: Name? diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 2d3da074..d1b89c9e 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -339,6 +339,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { when (val vol: GdmlPlacement? = group.placement) { is GdmlPhysVolume -> addPhysicalVolume(root, vol) is GdmlDivisionVolume -> addDivisionVolume(root, vol) + else -> {} } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index ecbb4177..3c7773bc 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -65,7 +65,7 @@ public fun SolidGroup.smartComposite( val group = SolidGroup(builder) if (name == null && group.meta.isEmpty()) { //append directly to group if no properties are defined - group.children.forEach { (key, value) -> + group.children.forEach { (_, value) -> value.parent = null set(null, value) } -- 2.34.1 From 6787ec85de471c343ce53f3cfc01748661c37ebe Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 12:28:41 +0300 Subject: [PATCH 042/143] Update kotlin and DF --- build.gradle.kts | 5 ++++- .../space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt | 4 ++-- .../space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt | 5 ++--- demo/js-playground/src/main/kotlin/gravityDemo.kt | 4 ++-- demo/js-playground/src/main/kotlin/markupComponent.kt | 4 ++-- demo/js-playground/src/main/kotlin/plotlyComponent.kt | 2 +- .../jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt | 4 ++-- .../src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt | 2 +- .../src/main/kotlin/space/kscience/visionforge/FXPlugin.kt | 4 ++-- .../space/kscience/visionforge/three/server/VisionServer.kt | 3 ++- 11 files changed, 21 insertions(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5c776dad..2be9327a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,5 +39,8 @@ apiValidation { //workaround for https://youtrack.jetbrains.com/issue/KT-48273 rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.webpackDevServer.version = "4.0.0" + rootProject.the().versions.apply { + webpack.version = "5.64.3" + webpackDevServer.version = "4.5.0" + } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index ae8b8ac8..156fedb0 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -7,7 +7,7 @@ import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get -import react.RProps +import react.Props import react.dom.h2 import react.functionComponent import react.useMemo @@ -27,7 +27,7 @@ import space.kscience.visionforge.solid.Solids import styled.css import styled.styledDiv -external interface GDMLAppProps : RProps { +external interface GDMLAppProps : Props { var context: Context var vision: Solid? var selected: Name? diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index dc659c7c..74246432 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.document import kotlinx.css.* -import react.child import react.dom.render -import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.gdml.toVision @@ -16,7 +15,7 @@ import styled.injectGlobal private class GDMLDemoApp : Application { override fun start(state: Map) { - val context = Global.buildContext("gdml-demo"){ + val context = Context("gdml-demo"){ plugin(ThreePlugin) } diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index e6f2273a..b2788b23 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -2,7 +2,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* -import react.RProps +import react.Props import react.functionComponent import space.kscience.dataforge.context.Context import space.kscience.plotly.layout @@ -16,7 +16,7 @@ import styled.css import styled.styledDiv import kotlin.math.sqrt -external interface DemoProps : RProps { +external interface DemoProps : Props { var context: Context } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 52696f8a..0cdb17d0 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -6,7 +6,7 @@ import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement -import react.RProps +import react.Props import react.functionComponent import react.useEffect import react.useRef @@ -16,7 +16,7 @@ import space.kscience.visionforge.useProperty import styled.css import styled.styledDiv -external interface MarkupProps : RProps { +external interface MarkupProps : Props { var markup: VisionOfMarkup? } diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index fa73f298..ee896df2 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -9,7 +9,7 @@ import space.kscience.plotly.plot import styled.css import styled.styledDiv -external interface PlotlyProps : RProps { +external interface PlotlyProps : Props { var plot: Plot? } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index f4ea0206..30a79315 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction -import react.RProps +import react.Props import react.dom.attrs import react.dom.button import react.dom.p @@ -28,7 +28,7 @@ import styled.styledDiv import styled.styledSpan import kotlin.math.PI -external interface MMAppProps : RProps { +external interface MMAppProps : Props { var model: Model var context: Context var connection: HttpClient diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt index 7cd54417..d62d3b0f 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt @@ -67,7 +67,7 @@ internal class SC1Aux(val sc: SC1, var efficiency: Double = 1.0) { UPPER_LAYER_Z -> 1 CENTRAL_LAYER_Z -> 2; LOWER_LAYER_Z -> 3; - else -> throw RuntimeException("Unknown layer"); + else -> error("Unknown layer"); } } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt index f8d45fd4..cee085bc 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt @@ -78,6 +78,6 @@ class Cos2TrackGenerator( return makeTrack(x, y, thetaCandidate, phi) } } - throw RuntimeException("Failed to generate theta from distribution") + error("Failed to generate theta from distribution") } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt index d8210a13..c571059c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt @@ -52,12 +52,12 @@ public class FXPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(meta) { while (!FX.initialized.get()) { if (Thread.interrupted()) { - throw RuntimeException("Interrupted application start") + error("Interrupted application start") } } Platform.setImplicitExit(false) } else { - throw RuntimeException("FX Application not defined") + error("FX Application not defined") } } } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 46cb2e66..b5693aa7 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -43,6 +43,7 @@ import java.awt.Desktop import java.net.URI import kotlin.collections.set import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds /** @@ -143,7 +144,7 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(visionManager, Duration.milliseconds(updateInterval)).collect { update -> + vision.flowChanges(visionManager, updateInterval.milliseconds).collect { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update -- 2.34.1 From a715c2660af2594d423e0701b08caf1787924699 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 13:52:22 +0300 Subject: [PATCH 043/143] Apply fix after https://github.com/Kotlin/kotlinx.serialization/issues/1602 --- .../kotlin/space/kscience/visionforge/VisionBase.kt | 4 +--- .../space/kscience/visionforge/markup/VisionOfMarkup.kt | 4 ---- .../space/kscience/visionforge/plotly/VisionOfPlotly.kt | 3 --- .../kotlin/space/kscience/visionforge/solid/SolidBase.kt | 4 ---- .../kotlin/space/kscience/visionforge/solid/SolidGroup.kt | 4 ---- .../kotlin/space/kscience/visionforge/solid/SolidReference.kt | 3 --- 6 files changed, 1 insertion(+), 21 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index dce9bbd5..e7865a24 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -29,11 +29,9 @@ internal data class MetaListener( @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, + protected var properties: MutableMeta? = null ) : Vision { - @Transient - protected open var properties: MutableMeta? = null - @Synchronized protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index a5ec3fa0..87682978 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -5,7 +5,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -18,9 +17,6 @@ public class VisionOfMarkup( public val format: String = COMMONMARK_FORMAT ) : VisionBase() { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - protected override var properties: MutableMeta? = null - //TODO add templates public var content: String? by meta.string(CONTENT_PROPERTY_KEY) diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 99df2e84..1b20b95f 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly @@ -12,8 +11,6 @@ import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor() : VisionBase() { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null public constructor(plot: Plot) : this() { properties = plot.meta diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 021079d3..70e2501e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,15 +2,11 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.VisionBase @Serializable @SerialName("solid") public open class SolidBase : VisionBase(), Solid { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null - override val descriptor: MetaDescriptor get() = Solid.descriptor } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 604aac01..b3e8ccd8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -32,9 +31,6 @@ public interface PrototypeHolder { @SerialName("group.solid") public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null - override val children: Map get() = super.childrenInternal.filter { it.key != PROTOTYPES_TOKEN } private var prototypes: MutableVisionGroup? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index eeab05ff..04c54907 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.get @@ -62,8 +61,6 @@ public class SolidReferenceGroup( public val refName: Name, ) : VisionBase(), SolidReference, VisionGroup, Solid { - override var properties: MutableMeta? = null - /** * Recursively search for defined template in the parent */ -- 2.34.1 From 8d74bc55d1442e7e3898a3c6d1e5bbf717d030d0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 14:30:43 +0300 Subject: [PATCH 044/143] fix DF version --- build.gradle.kts | 2 +- .../jsMain/kotlin/space/kscience/visionforge/VisionClient.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2be9327a..551ef7df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.2-dev-2") +val dataforgeVersion by extra("0.5.2-dev-3") val fxVersion by extra("11") allprojects { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 017c615d..7c118233 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -17,7 +17,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOI import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass -import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -105,7 +105,7 @@ public class VisionClient : AbstractPlugin() { onopen = { feedbackJob = vision.flowChanges( visionManager, - Duration.Companion.milliseconds(300) + 300.milliseconds ).onEach { change -> send(visionManager.encodeToString(change)) }.launchIn(visionManager.context) -- 2.34.1 From e7f0e1e4fcacf214f885d16d51389c4be7f73673 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 Nov 2021 21:27:08 +0300 Subject: [PATCH 045/143] Workarround serialization bug --- build.gradle.kts | 4 +-- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +-- gradle.properties | 5 +++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../space/kscience/visionforge/VisionBase.kt | 4 +-- .../kscience/visionforge/VisionGroupBase.kt | 25 +++++++++---------- .../kscience/visionforge/VisionManager.kt | 3 +++ .../kscience/visionforge/html/HtmlTagTest.kt | 3 +-- .../kscience/visionforge/VisionClient.kt | 2 ++ .../visionforge/plotly/VisionOfPlotly.kt | 1 + .../visionforge/three/server/VisionServer.kt | 3 ++- 11 files changed, 32 insertions(+), 24 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 551ef7df..62f608e4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.2-dev-3") +val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") allprojects { @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-25" + version = "0.2.0" } subprojects { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 8b286e07..3a360ce7 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.html.div import kotlinx.html.h1 -import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.* import space.kscience.visionforge.three.server.* @@ -15,7 +15,7 @@ import space.kscience.visionforge.visionManager import kotlin.random.Random fun main() { - val satContext = Global.buildContext ("sat") { + val satContext = Context("sat") { plugin(Solids) } diff --git a/gradle.properties b/gradle.properties index 0443442f..41982482 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,7 @@ kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G -org.gradle.parallel=true \ No newline at end of file +org.gradle.parallel=true + +publishing.github=false +publishing.sonatype=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a25..e750102e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index e7865a24..6e2e95d0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -29,7 +30,7 @@ internal data class MetaListener( @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, - protected var properties: MutableMeta? = null + @EncodeDefault protected var properties: MutableMeta? = null, ) : Vision { @Synchronized @@ -131,7 +132,6 @@ public open class VisionBase( override val descriptor: MetaDescriptor? get() = null - override fun invalidateProperty(propertyName: Name) { if (propertyName == STYLE_KEY) { styles.mapNotNull { getStyle(it) }.asSequence() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index d4af712d..e8594df2 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -16,7 +17,7 @@ private class StructureChangeListener(val owner: Any?, val callback: VisionGroup @Serializable @SerialName("vision.group") public open class VisionGroupBase( - @SerialName("children") protected val childrenInternal: MutableMap = LinkedHashMap(), + @EncodeDefault @SerialName("children") protected val childrenInternal: MutableMap = LinkedHashMap(), ) : VisionBase(), MutableVisionGroup { /** @@ -102,21 +103,19 @@ public open class VisionGroupBase( /** * Recursively create a child group */ - private fun createGroups(name: Name): VisionGroupBase { - return when { - name.isEmpty() -> error("Should be unreachable") - name.length == 1 -> { - val token = name.tokens.first() - when (val current = children[token]) { - null -> createGroup().also { child -> - attachChild(token, child) - } - is VisionGroupBase -> current - else -> error("Can't create group with name $name because it exists and not a group") + private fun createGroups(name: Name): VisionGroupBase = when { + name.isEmpty() -> error("Should be unreachable") + name.length == 1 -> { + val token = name.tokens.first() + when (val current = children[token]) { + null -> createGroup().also { child -> + attachChild(token, child) } + is VisionGroupBase -> current + else -> error("Can't create group with name $name because it exists and not a group") } - else -> createGroups(name.tokens.first().asName()).createGroups(name.cutFirst()) } + else -> createGroups(name.tokens.first().asName()).createGroups(name.cutFirst()) } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 3f9bfaa8..ff4c29e1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement @@ -68,12 +69,14 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { } } + @OptIn(ExperimentalSerializationApi::class) public val defaultJson: Json = Json { serializersModule = defaultSerialModule prettyPrint = true useArrayPolymorphism = false encodeDefaults = false ignoreUnknownKeys = true + explicitNulls = false } internal val visionSerializer: PolymorphicSerializer = PolymorphicSerializer(Vision::class) diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 3572dd42..d6cd8dd1 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -37,8 +37,7 @@ fun FlowContent.renderVisionFragment( @DFExperimental class HtmlTagTest { - fun VisionOutput.base(block: VisionBase.() -> Unit) = - VisionBase().apply(block) + fun VisionOutput.base(block: VisionBase.() -> Unit) = VisionBase().apply(block) val fragment: HtmlVisionFragment = { div { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 7c118233..63f9a882 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -18,6 +18,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -56,6 +57,7 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null + @OptIn(ExperimentalTime::class) private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 1b20b95f..eaa94573 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -15,6 +15,7 @@ public class VisionOfPlotly private constructor() : VisionBase() { public constructor(plot: Plot) : this() { properties = plot.meta } + public val plot: Plot get() = Plot(meta) } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index b5693aa7..0018ab83 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -44,6 +44,7 @@ import java.net.URI import kotlin.collections.set import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime /** @@ -121,7 +122,7 @@ public class VisionServer internal constructor( /** * Server a map of visions without providing explicit html page for them */ - @OptIn(DFExperimental::class) + @OptIn(DFExperimental::class, ExperimentalTime::class) public fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") -- 2.34.1 From 3caa22f8bf0bad62ea9d2b123e4f60a1b89eeaf1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 6 Dec 2021 22:45:24 +0300 Subject: [PATCH 046/143] [WIP] Moving renderers to a common API --- .../visionforge-jupyter-base/build.gradle.kts | 25 ++++++ .../src/jvmMain/kotlin/JupyterPluginBase.kt | 84 +++++++++++++++++++ .../build.gradle.kts | 0 .../src/jsMain/kotlin/gdmlJupyter.kt | 0 .../src/jvmMain/kotlin/GdmlForJupyter.kt | 2 +- .../webpack.config.d/01.ring.js | 0 settings.gradle.kts | 16 +++- .../visionforge/html/HtmlVisionRenderer.kt | 44 +++++++--- .../visionforge/html/VisionTagConsumer.kt | 2 + .../kscience/visionforge/VisionClient.kt | 8 +- .../visionforge/three/server/VisionServer.kt | 67 +++++++-------- 11 files changed, 195 insertions(+), 53 deletions(-) create mode 100644 jupyter/visionforge-jupyter-base/build.gradle.kts create mode 100644 jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/build.gradle.kts (100%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/src/jsMain/kotlin/gdmlJupyter.kt (100%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/src/jvmMain/kotlin/GdmlForJupyter.kt (98%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/webpack.config.d/01.ring.js (100%) diff --git a/jupyter/visionforge-jupyter-base/build.gradle.kts b/jupyter/visionforge-jupyter-base/build.gradle.kts new file mode 100644 index 00000000..3e5f671d --- /dev/null +++ b/jupyter/visionforge-jupyter-base/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") + id("org.jetbrains.kotlin.jupyter.api") +} + +description = "Common visionforge jupyter module" + +kotlin { + sourceSets { + commonMain{ + dependencies{ + api(projects.visionforge.visionforgeCore) + } + } + jvmMain { + dependencies { + implementation(project(":visionforge-server")) + } + } + } +} + +readme { + maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL +} \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt new file mode 100644 index 00000000..f912a88f --- /dev/null +++ b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -0,0 +1,84 @@ +package space.kscience.visionforge.jupyter + +import io.ktor.server.cio.CIO +import io.ktor.server.engine.ApplicationEngine +import io.ktor.server.engine.embeddedServer +import kotlinx.html.stream.createHTML +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import org.jetbrains.kotlinx.jupyter.api.libraries.resources +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.string +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.Vision +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.three.server.VisionServer +import space.kscience.visionforge.three.server.visionServer +import space.kscience.visionforge.visionManager + +private const val DEFAULT_VISIONFORGE_PORT = 88898 + +@DFExperimental +public abstract class JupyterPluginBase( + override val context: Context, +) : JupyterIntegration(), ContextAware { + + private var counter = 0 + + private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) + }.finalize() + + private var engine: ApplicationEngine? = null + private var server: VisionServer? = null + + override fun Builder.onLoaded() { + + onLoaded { + val host = context.properties["visionforge.host"].string ?: "localhost" + val port = context.properties["visionforge.port"].int ?: DEFAULT_VISIONFORGE_PORT + engine = context.embeddedServer(CIO, port, host) { + server = visionServer(context) + }.start() + } + + onShutdown { + engine?.stop(1000, 1000) + engine = null + server = null + } + + resources { + js("three") { + classPath("js/gdml-jupyter.js") + } + } + + import( + "kotlinx.html.*", + "space.kscience.visionforge.html.Page", + "space.kscience.visionforge.html.page", + ) + + render { vision -> + val server = this@JupyterPluginBase.server + if (server == null) { + HTML(produceHtmlVisionString { vision(vision) }) + } else { + val route = "route.${counter++}" + HTML(server.createHtmlAndServe(route,route, emptyList()){ + vision(vision) + }) + } + } + + render { page -> + //HTML(page.render(createHTML()), true) + } + } +} diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts similarity index 100% rename from jupyter/visionforge-gdml-jupyter/build.gradle.kts rename to jupyter/visionforge-jupyter-gdml/build.gradle.kts diff --git a/jupyter/visionforge-gdml-jupyter/src/jsMain/kotlin/gdmlJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt similarity index 100% rename from jupyter/visionforge-gdml-jupyter/src/jsMain/kotlin/gdmlJupyter.kt rename to jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt diff --git a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt similarity index 98% rename from jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt rename to jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index ce32f012..2aa1873b 100644 --- a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -25,7 +25,7 @@ internal class GdmlForJupyter : JupyterIntegration() { private var counter = 0 private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment) + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) }.finalize() override fun Builder.onLoaded() { diff --git a/jupyter/visionforge-gdml-jupyter/webpack.config.d/01.ring.js b/jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js similarity index 100% rename from jupyter/visionforge-gdml-jupyter/webpack.config.d/01.ring.js rename to jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js diff --git a/settings.gradle.kts b/settings.gradle.kts index 4cdc6b82..088b448f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,19 @@ rootProject.name = "visionforge" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("VERSION_CATALOGS") +dependencyResolutionManagement { + repositories { + maven("https://repo.kotlin.link") + mavenCentral() + } + + versionCatalogs { + create("npmlibs") { + from("ru.mipt.npm:version-catalog:0.10.7") + } + } +} + include( // ":ui", ":ui:react", @@ -46,5 +59,6 @@ include( ":demo:jupyter-playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:visionforge-gdml-jupyter" + ":jupyter:visionforge-jupyter-base", + ":jupyter:visionforge-jupyter-gdml" ) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index e45e4f08..7bfe5012 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -7,9 +7,11 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager - public fun TagConsumer<*>.embedVisionFragment( manager: VisionManager, + embedData: Boolean = true, + fetchData: String? = null, + fetchUpdates: String? = null, idPrefix: String? = null, fragment: HtmlVisionFragment, ): Map { @@ -17,11 +19,23 @@ public fun TagConsumer<*>.embedVisionFragment( val consumer = object : VisionTagConsumer(this@embedVisionFragment, manager, idPrefix) { override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision - script { - type = "text/json" - attributes["class"] = OUTPUT_DATA_CLASS - unsafe { - +"\n${manager.encodeToString(vision)}\n" + // Toggle update mode + + fetchUpdates?.let { + attributes[OUTPUT_CONNECT_ATTRIBUTE] = it + } + + fetchData?.let { + attributes[OUTPUT_FETCH_ATTRIBUTE] = it + } + + if (embedData) { + script { + type = "text/json" + attributes["class"] = OUTPUT_DATA_CLASS + unsafe { + +"\n${manager.encodeToString(vision)}\n" + } } } } @@ -32,19 +46,29 @@ public fun TagConsumer<*>.embedVisionFragment( public fun FlowContent.embedVisionFragment( manager: VisionManager, + embedData: Boolean = true, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, idPrefix: String? = null, fragment: HtmlVisionFragment, -): Map = consumer.embedVisionFragment(manager, idPrefix, fragment) +): Map = consumer.embedVisionFragment(manager, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, fragment) internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" -@DFExperimental -public fun TagConsumer<*>.embedAndRenderVisionFragment(manager: VisionManager, id: Any, fragment: HtmlVisionFragment) { +public fun TagConsumer<*>.embedAndRenderVisionFragment( + manager: VisionManager, + id: Any, + embedData: Boolean = true, + fetchData: String? = null, + fetchUpdates: String? = null, + idPrefix: String? = null, + fragment: HtmlVisionFragment, +) { div { div { this.id = id.toString() - embedVisionFragment(manager, fragment = fragment) + embedVisionFragment(manager, embedData, fetchData, fetchUpdates, idPrefix, fragment) } script { type = "text/javascript" diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 035b6a6e..27725721 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -126,6 +126,8 @@ public abstract class VisionTagConsumer( public const val OUTPUT_ENDPOINT_ATTRIBUTE: String = "data-output-endpoint" public const val DEFAULT_ENDPOINT: String = "." + public const val AUTO_DATA_ATTRIBUTE: String = "@auto" + public const val DEFAULT_VISION_NAME: String = "vision" } } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 63f9a882..60f7a627 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -18,7 +18,6 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -27,7 +26,7 @@ public class VisionClient : AbstractPlugin() { //private val visionMap = HashMap() /** - * Up-going tree traversal in search for endpoint attribute + * Up-going tree traversal in search for endpoint attribute. If element is null, return window URL */ private fun resolveEndpoint(element: Element?): String { if (element == null) return window.location.href @@ -57,14 +56,13 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null - @OptIn(ExperimentalTime::class) private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") renderer.render(element, vision, outputMeta) element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> - val wsUrl = if (attr.value.isBlank() || attr.value == "auto") { + val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { @@ -154,7 +152,7 @@ public class VisionClient : AbstractPlugin() { element.attributes[OUTPUT_FETCH_ATTRIBUTE] != null -> { val attr = element.attributes[OUTPUT_FETCH_ATTRIBUTE]!! - val fetchUrl = if (attr.value.isBlank() || attr.value == "auto") { + val fetchUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 0018ab83..61c3fd84 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -34,10 +34,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges -import space.kscience.visionforge.html.HtmlFragment -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.VisionTagConsumer -import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.* import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI @@ -71,36 +68,12 @@ public class VisionServer internal constructor( globalHeaders.add(block) } - private fun HTML.buildPage( - visionFragment: HtmlVisionFragment, + private fun HTML.visionPage( title: String, headers: List, + visionFragment: HtmlVisionFragment, ): Map { - val visionMap = HashMap() - - val consumer = object : VisionTagConsumer(consumer, visionManager) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { - visionMap[name] = vision - // Toggle update mode - if (dataConnect) { - attributes[OUTPUT_CONNECT_ATTRIBUTE] = "auto" - } - - if (dataFetch) { - attributes[OUTPUT_FETCH_ATTRIBUTE] = "auto" - } - - if (dataEmbed) { - script { - type = "text/json" - attributes["class"] = OUTPUT_DATA_CLASS - unsafe { - +"\n${visionManager.encodeToString(vision)}\n" - } - } - } - } - } + var visionMap: Map? = null head { meta { @@ -113,16 +86,22 @@ public class VisionServer internal constructor( } body { //Load the fragment and remember all loaded visions - visionFragment(consumer) + visionMap = embedVisionFragment( + manager = visionManager, + embedData = true, + fetchDataUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fetchUpdatesUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fragment = visionFragment + ) } - return visionMap + return visionMap!! } /** * Server a map of visions without providing explicit html page for them */ - @OptIn(DFExperimental::class, ExperimentalTime::class) + @OptIn(DFExperimental::class) public fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") @@ -175,6 +154,22 @@ public class VisionServer internal constructor( } } + /** + * Create a static html page and serve visions produced in the process + */ + @DFExperimental + public fun createHtmlAndServe(route: String, title: String, headers: List, visionFragment: HtmlVisionFragment): String{ + val htmlString = createHTML().apply { + html { + visionPage(title, headers, visionFragment).also { + serveVisions(route, it) + } + } + }.finalize() + + return htmlString + } + /** * Serv visions in a given [route] without providing a page template */ @@ -203,7 +198,7 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(buildPage(visionFragment, title, headers)) + visions.putAll(visionPage(title, headers, visionFragment)) } } else { null @@ -219,7 +214,7 @@ public class VisionServer internal constructor( //re-create html and vision list on each call call.respondHtml { visions.clear() - visions.putAll(buildPage(visionFragment, title, headers)) + visions.putAll(visionPage(title, headers, visionFragment)) } } else { //Use cached html -- 2.34.1 From b5fdc6c4fee7a39b84afbdabbdce1c96e7d8e91c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 29 Dec 2021 13:17:57 +0300 Subject: [PATCH 047/143] Update to tools 0.10.9 --- demo/muon-monitor/build.gradle.kts | 12 +- gradle.properties | 4 +- settings.gradle.kts | 7 +- .../visionforge/react/MultiSelectChooser.kt | 43 ++-- .../visionforge/react/PropertyEditor.kt | 13 +- .../visionforge/react/RangeValueChooser.kt | 97 ++++---- .../visionforge/react/ThreeCanvasComponent.kt | 6 +- .../kscience/visionforge/react/VisionTree.kt | 6 +- .../visionforge/react/valueChooser.kt | 213 +++++++++--------- visionforge-core/build.gradle.kts | 4 +- .../visionforge/editor/ValueChooser.kt | 46 ++-- .../kscience/visionforge/solid/geometry.kt | 2 +- 12 files changed, 223 insertions(+), 230 deletions(-) diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index a7bf2709..0ef8f166 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -5,7 +5,7 @@ plugins { group = "ru.mipt.npm" -val ktorVersion: String = ru.mipt.npm.gradle.KScienceVersions.ktorVersion +val ktorVersion: String = npmlibs.versions.ktor.get() kscience { useCoroutines() @@ -45,17 +45,17 @@ kotlin { jvmMain { dependencies { implementation("org.apache.commons:commons-math3:3.6.1") - implementation("io.ktor:ktor-server-cio:$ktorVersion") - implementation("io.ktor:ktor-serialization:$ktorVersion") + implementation(npmlibs.ktor.server.cio) + implementation(npmlibs.ktor.serialization) } } jsMain { dependencies { implementation(project(":ui:ring")) - implementation("io.ktor:ktor-client-js:$ktorVersion") - implementation("io.ktor:ktor-client-serialization:$ktorVersion") + implementation(npmlibs.ktor.client.js) + implementation(npmlibs.ktor.client.serialization) implementation(project(":visionforge-threejs")) - implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) + //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } } } diff --git a/gradle.properties b/gradle.properties index 41982482..fbaacb05 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,4 +7,6 @@ org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true publishing.github=false -publishing.sonatype=false \ No newline at end of file +publishing.sonatype=false + +toolsVersion=0.10.9-kotlin-1.6.10 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 088b448f..fb02e336 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { - val toolsVersion = "0.10.7" + val toolsVersion: String by extra repositories { //mavenLocal() @@ -23,6 +23,9 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("VERSION_CATALOGS") dependencyResolutionManagement { + + val toolsVersion: String by extra + repositories { maven("https://repo.kotlin.link") mavenCentral() @@ -30,7 +33,7 @@ dependencyResolutionManagement { versionCatalogs { create("npmlibs") { - from("ru.mipt.npm:version-catalog:0.10.7") + from("ru.mipt.npm:version-catalog:$toolsVersion") } } } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 45a98abd..f3c81a57 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -5,35 +5,34 @@ import org.w3c.dom.HTMLOptionElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.asList import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.dom.attrs import react.dom.option import react.dom.select -import react.functionComponent +import react.fc import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @JsExport -public val MultiSelectChooser: FunctionComponent = - functionComponent("MultiSelectChooser") { props -> - val onChange: (Event) -> Unit = { event: Event -> - val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() - .map { (it as HTMLOptionElement).value.asValue() } - props.meta.value = newSelected.asValue() +public val MultiSelectChooser: FC = fc("MultiSelectChooser") { props -> + val onChange: (Event) -> Unit = { event: Event -> + val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() + .map { (it as HTMLOptionElement).value.asValue() } + props.meta.value = newSelected.asValue() + } + + select { + attrs { + multiple = true + values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } + onChangeFunction = onChange + } + props.descriptor?.allowedValues?.forEach { optionValue -> + option { + +optionValue.string + } } - select { - attrs { - multiple = true - values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } - onChangeFunction = onChange - } - props.descriptor?.allowedValues?.forEach { optionValue -> - option { - +optionValue.string - } - } - - } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 4264b77f..6c677e2e 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -47,10 +47,9 @@ public external interface PropertyEditorProps : Props { public var expanded: Boolean? } -private val PropertyEditorItem: FunctionComponent = - functionComponent("PropertyEditorItem") { props -> - propertyEditorItem(props) - } +private val PropertyEditorItem: FC = fc("PropertyEditorItem") { props -> + propertyEditorItem(props) +} private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } @@ -129,7 +128,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { width = 160.px margin(1.px, 5.px) } - ValueChooser{ + ValueChooser { attrs { this.descriptor = descriptor this.meta = ownProperty @@ -193,7 +192,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } @JsExport -public val PropertyEditor: FunctionComponent = functionComponent("PropertyEditor") { props -> +public val PropertyEditor: FC = fc("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" @@ -211,7 +210,7 @@ public fun RBuilder.propertyEditor( allProperties: MetaProvider = ownProperties, descriptor: MetaDescriptor? = null, key: Any? = null, - expanded: Boolean? = null + expanded: Boolean? = null, ) { child(PropertyEditor) { attrs { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index bda76147..8ccedc01 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -6,9 +6,9 @@ import kotlinx.html.InputType import kotlinx.html.js.onChangeFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.dom.attrs -import react.functionComponent +import react.fc import react.useState import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double @@ -19,58 +19,57 @@ import styled.css import styled.styledInput @JsExport -public val RangeValueChooser: FunctionComponent = - functionComponent("RangeValueChooser") { props -> - var innerValue by useState(props.actual.double) - var rangeDisabled: Boolean by useState(props.meta.value == null) +public val RangeValueChooser: FC = fc("RangeValueChooser") { props -> + var innerValue by useState(props.actual.double) + var rangeDisabled: Boolean by useState(props.meta.value == null) - val handleDisable: (Event) -> Unit = { - val checkBoxValue = (it.target as HTMLInputElement).checked - rangeDisabled = !checkBoxValue - props.meta.value = if(!checkBoxValue) { - null - } else { - innerValue?.asValue() - } + val handleDisable: (Event) -> Unit = { + val checkBoxValue = (it.target as HTMLInputElement).checked + rangeDisabled = !checkBoxValue + props.meta.value = if (!checkBoxValue) { + null + } else { + innerValue?.asValue() } + } - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).value - props.meta.value = newValue.toDoubleOrNull()?.asValue() - innerValue = newValue.toDoubleOrNull() - } + val handleChange: (Event) -> Unit = { + val newValue = (it.target as HTMLInputElement).value + props.meta.value = newValue.toDoubleOrNull()?.asValue() + innerValue = newValue.toDoubleOrNull() + } - flexRow { - if(props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { - styledInput(type = InputType.checkBox) { - attrs { - defaultChecked = rangeDisabled.not() - onChangeFunction = handleDisable - } - } - } - - styledInput(type = InputType.range) { - css{ - width = 100.pct - } + flexRow { + if (props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { + styledInput(type = InputType.checkBox) { attrs { - disabled = rangeDisabled - value = innerValue?.toString() ?: "" - onChangeFunction = handleChange - consumer.onTagEvent(this, "input", handleChange) - val minValue = props.descriptor?.attributes?.get("min").string - minValue?.let { - min = it - } - val maxValue = props.descriptor?.attributes?.get("max").string - maxValue?.let { - max = it - } - props.descriptor?.attributes?.get("step").string?.let { - step = it - } + defaultChecked = rangeDisabled.not() + onChangeFunction = handleDisable } } } - } \ No newline at end of file + + styledInput(type = InputType.range) { + css { + width = 100.pct + } + attrs { + disabled = rangeDisabled + value = innerValue?.toString() ?: "" + onChangeFunction = handleChange + consumer.onTagEvent(this, "input", handleChange) + val minValue = props.descriptor?.attributes?.get("min").string + minValue?.let { + min = it + } + val maxValue = props.descriptor?.attributes?.get("max").string + maxValue?.let { + max = it + } + props.descriptor?.attributes?.get("step").string?.let { + step = it + } + } + } + } +} \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 319a867c..4683f579 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -21,13 +21,11 @@ public external interface ThreeCanvasProps : Props { public var selected: Name? } -public val ThreeCanvasComponent: FunctionComponent = functionComponent( - "ThreeCanvasComponent" -) { props -> +public val ThreeCanvasComponent: FC = fc("ThreeCanvasComponent") { props -> val elementRef = useRef(null) var canvas by useState(null) - val three: ThreePlugin = useMemo(props.context){ props.context.fetch(ThreePlugin) } + val three: ThreePlugin = useMemo(props.context) { props.context.fetch(ThreePlugin) } useEffect(props.solid, props.options, elementRef) { if (canvas == null) { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 539fa2ee..54fc8ec4 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -28,7 +28,7 @@ public external interface ObjectTreeProps : Props { public var clickCallback: (Name) -> Unit } -private val TreeLabel = functionComponent { props -> +private val TreeLabel = fc { props -> val token = useMemo(props.name) { props.name.lastOrNull()?.toString() ?: "World" } styledSpan { css { @@ -107,14 +107,14 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } @JsExport -public val ObjectTree: FunctionComponent = functionComponent("ObjectTree") { props -> +public val ObjectTree: FC = fc("ObjectTree") { props -> visionTree(props) } public fun RBuilder.visionTree( vision: Vision, selected: Name? = null, - clickCallback: (Name) -> Unit = {} + clickCallback: (Name) -> Unit = {}, ) { child(ObjectTree) { attrs { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 1296d777..03996c04 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -10,11 +10,11 @@ import kotlinx.html.js.onKeyDownFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.Props import react.dom.attrs import react.dom.option -import react.functionComponent +import react.fc import react.useState import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -36,136 +36,131 @@ public external interface ValueChooserProps : Props { } @JsExport -public val StringValueChooser: FunctionComponent = - functionComponent("StringValueChooser") { props -> - var value by useState(props.actual.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - value = (event.target as HTMLInputElement).value - props.meta.value = value.asValue() - } +public val StringValueChooser: FC = fc("StringValueChooser") { props -> + var value by useState(props.actual.string ?: "") + val keyDown: (Event) -> Unit = { event -> + if (event.type == "keydown" && event.asDynamic().key == "Enter") { + value = (event.target as HTMLInputElement).value + props.meta.value = value.asValue() } - val handleChange: (Event) -> Unit = { - value = (it.target as HTMLInputElement).value + } + val handleChange: (Event) -> Unit = { + value = (it.target as HTMLInputElement).value + } + styledInput(type = InputType.text) { + css { + width = 100.pct } - styledInput(type = InputType.text) { - css { - width = 100.pct - } - attrs { - this.value = value - onKeyDownFunction = keyDown - onChangeFunction = handleChange + attrs { + this.value = value + onKeyDownFunction = keyDown + onChangeFunction = handleChange + } + } +} + +@JsExport +public val BooleanValueChooser: FC = fc("BooleanValueChooser") { props -> + val handleChange: (Event) -> Unit = { + val newValue = (it.target as HTMLInputElement).checked + props.meta.value = newValue.asValue() + } + styledInput(type = InputType.checkBox) { + css { + width = 100.pct + } + attrs { + //this.attributes["indeterminate"] = (props.item == null).toString() + checked = props.actual.boolean ?: false + onChangeFunction = handleChange + } + } +} + +@JsExport +public val NumberValueChooser: FC = fc("NumberValueChooser") { props -> + var innerValue by useState(props.actual.string ?: "") + val keyDown: (Event) -> Unit = { event -> + if (event.type == "keydown" && event.asDynamic().key == "Enter") { + innerValue = (event.target as HTMLInputElement).value + val number = innerValue.toDoubleOrNull() + if (number == null) { + console.error("The input value $innerValue is not a number") + } else { + props.meta.value = number.asValue() } } } - -@JsExport -public val BooleanValueChooser: FunctionComponent = - functionComponent("BooleanValueChooser") { props -> - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).checked - props.meta.value = newValue.asValue() + val handleChange: (Event) -> Unit = { + innerValue = (it.target as HTMLInputElement).value + } + styledInput(type = InputType.number) { + css { + width = 100.pct } - styledInput(type = InputType.checkBox) { - css { - width = 100.pct + attrs { + value = innerValue + onKeyDownFunction = keyDown + onChangeFunction = handleChange + props.descriptor?.attributes?.get("step").string?.let { + step = it } - attrs { - //this.attributes["indeterminate"] = (props.item == null).toString() - checked = props.actual.boolean ?: false - onChangeFunction = handleChange + props.descriptor?.attributes?.get("min").string?.let { + min = it + } + props.descriptor?.attributes?.get("max").string?.let { + max = it } } } +} @JsExport -public val NumberValueChooser: FunctionComponent = - functionComponent("NumberValueChooser") { props -> - var innerValue by useState(props.actual.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - innerValue = (event.target as HTMLInputElement).value - val number = innerValue.toDoubleOrNull() - if (number == null) { - console.error("The input value $innerValue is not a number") - } else { - props.meta.value = number.asValue() - } +public val ComboValueChooser: FC = fc("ComboValueChooser") { props -> + var selected by useState(props.actual.string ?: "") + val handleChange: (Event) -> Unit = { + selected = (it.target as HTMLSelectElement).value + props.meta.value = selected.asValue() + } + styledSelect { + css { + width = 100.pct + } + props.descriptor?.allowedValues?.forEach { + option { + +it.string } } - val handleChange: (Event) -> Unit = { - innerValue = (it.target as HTMLInputElement).value - } - styledInput(type = InputType.number) { - css { - width = 100.pct - } - attrs { - value = innerValue - onKeyDownFunction = keyDown - onChangeFunction = handleChange - props.descriptor?.attributes?.get("step").string?.let { - step = it - } - props.descriptor?.attributes?.get("min").string?.let { - min = it - } - props.descriptor?.attributes?.get("max").string?.let { - max = it - } - } + attrs { + this.value = props.actual.string ?: "" + multiple = false + onChangeFunction = handleChange } } +} @JsExport -public val ComboValueChooser: FunctionComponent = - functionComponent("ComboValueChooser") { props -> - var selected by useState(props.actual.string ?: "") - val handleChange: (Event) -> Unit = { - selected = (it.target as HTMLSelectElement).value - props.meta.value = selected.asValue() +public val ColorValueChooser: FC = fc("ColorValueChooser") { props -> + val handleChange: (Event) -> Unit = { + props.meta.value = (it.target as HTMLInputElement).value.asValue() + } + styledInput(type = InputType.color) { + css { + width = 100.pct + margin(0.px) } - styledSelect { - css { - width = 100.pct - } - props.descriptor?.allowedValues?.forEach { - option { - +it.string - } - } - attrs { - this.value = props.actual.string ?: "" - multiple = false - onChangeFunction = handleChange - } + attrs { + this.value = props.actual.value?.let { value -> + if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) + else value.string + } ?: "#000000" + onChangeFunction = handleChange } } +} @JsExport -public val ColorValueChooser: FunctionComponent = - functionComponent("ColorValueChooser") { props -> - val handleChange: (Event) -> Unit = { - props.meta.value = (it.target as HTMLInputElement).value.asValue() - } - styledInput(type = InputType.color) { - css { - width = 100.pct - margin(0.px) - } - attrs { - this.value = props.actual.value?.let { value -> - if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else value.string - } ?: "#000000" - onChangeFunction = handleChange - } - } - } - -@JsExport -public val ValueChooser: FunctionComponent = functionComponent("ValueChooser") { props -> +public val ValueChooser: FC = fc("ValueChooser") { props -> val rawInput by useState(false) val descriptor = props.descriptor diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 3af5c602..b411dee9 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -5,7 +5,9 @@ plugins { val dataforgeVersion: String by rootProject.extra kscience{ - useSerialization() + useSerialization{ + json() + } } kotlin { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index d4ce7bb5..f62513b0 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -71,35 +71,31 @@ public interface ValueChooser { public companion object { - private fun findWidgetByType(context: Context, type: String): Factory? { - return when (Name.parse(type)) { - TextValueChooser.name -> TextValueChooser - ColorValueChooser.name -> ColorValueChooser - ComboBoxValueChooser.name -> ComboBoxValueChooser - else -> null//context.provideByType(type)//Search for additional factories in the plugin - } + private fun findWidgetByType(context: Context, type: String): Factory? = when (Name.parse(type)) { + TextValueChooser.name -> TextValueChooser + ColorValueChooser.name -> ColorValueChooser + ComboBoxValueChooser.name -> ComboBoxValueChooser + else -> null//context.provideByType(type)//Search for additional factories in the plugin } - private fun build(context: Context, descriptor: MetaDescriptor?): ValueChooser { - return if (descriptor == null) { - TextValueChooser(); - } else { - val widgetType = descriptor.widgetType - val chooser: ValueChooser = when { - widgetType != null -> { - findWidgetByType( - context, - widgetType - )?.invoke( - descriptor.widget - ) ?: TextValueChooser() - } - !descriptor.allowedValues.isNullOrEmpty() -> ComboBoxValueChooser() - else -> TextValueChooser() + private fun build(context: Context, descriptor: MetaDescriptor?): ValueChooser = if (descriptor == null) { + TextValueChooser(); + } else { + val widgetType = descriptor.widgetType + val chooser: ValueChooser = when { + widgetType != null -> { + findWidgetByType( + context, + widgetType + )?.invoke( + descriptor.widget + ) ?: TextValueChooser() } - chooser.descriptor = descriptor - chooser + !descriptor.allowedValues.isNullOrEmpty() -> ComboBoxValueChooser() + else -> TextValueChooser() } + chooser.descriptor = descriptor + chooser } public fun build( diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index ccff7dcd..f815a262 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -42,6 +42,7 @@ public interface Point3D { } } +@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @Serializable(Point3DSerializer::class) public interface MutablePoint3D : Point3D { override var x: Float @@ -56,7 +57,6 @@ internal object Point3DSerializer : KSerializer { override val descriptor: SerialDescriptor = Point3DImpl.serializer().descriptor - override fun deserialize(decoder: Decoder): MutablePoint3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) override fun serialize(encoder: Encoder, value: Point3D) { -- 2.34.1 From 104e8f8f6fee3bfadfeaa67e2de5dfb55bad6f63 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 29 Dec 2021 20:00:03 +0300 Subject: [PATCH 048/143] Remove Ktor client --- build.gradle.kts | 2 - .../mipt/npm/root/serialization/jsonToRoot.kt | 1 + .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- .../src/main/kotlin/gravityDemo.kt | 4 +- .../src/main/kotlin/markupComponent.kt | 4 +- .../src/main/kotlin/plotlyComponent.kt | 2 +- demo/muon-monitor/build.gradle.kts | 2 - .../mipt/npm/muon/monitor/MMAppComponent.kt | 31 ++- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 13 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../visionforge/bootstrap/outputConfig.kt | 6 +- .../visionforge/bootstrap/tabComponent.kt | 4 +- .../visionforge/bootstrap/threeControls.kt | 6 +- .../kscience/visionforge/react/MetaViewer.kt | 4 +- .../ThreeViewWithControls.kt | 203 +++++++++--------- .../ringThreeControls.kt | 8 +- visionforge-core/build.gradle.kts | 2 +- visionforge-server/build.gradle.kts | 9 +- .../visionforge/three/server/VisionServer.kt | 57 ++++- 20 files changed, 199 insertions(+), 167 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 62f608e4..625efc2c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,5 @@ plugins { id("ru.mipt.npm.gradle.project") -// kotlin("multiplatform") version "1.5.30" apply false -// kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.2") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index 94079ccd..5d338394 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -46,6 +46,7 @@ private object RootDecoder { private val refCache: List, ) : KSerializer by tSerializer { + @Suppress("UNCHECKED_CAST") override fun deserialize(decoder: Decoder): T { val input = decoder as JsonDecoder val element = input.decodeJsonElement() diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 156fedb0..e5787050 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -9,7 +9,7 @@ import org.w3c.files.FileReader import org.w3c.files.get import react.Props import react.dom.h2 -import react.functionComponent +import react.fc import react.useMemo import react.useState import space.kscience.dataforge.context.Context @@ -34,7 +34,7 @@ external interface GDMLAppProps : Props { } @JsExport -val GDMLApp = functionComponent("GDMLApp") { props -> +val GDMLApp = fc("GDMLApp") { props -> val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } var deferredVision: Deferred by useState { CompletableDeferred(props.vision) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index b2788b23..716cc2c3 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -3,7 +3,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* import react.Props -import react.functionComponent +import react.fc import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace @@ -20,7 +20,7 @@ external interface DemoProps : Props { var context: Context } -val GravityDemo = functionComponent { props -> +val GravityDemo = fc { props -> val velocityTrace = Trace{ name = "velocity" } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 0cdb17d0..4bbe4b80 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -7,7 +7,7 @@ import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.Props -import react.functionComponent +import react.fc import react.useEffect import react.useRef import space.kscience.visionforge.markup.VisionOfMarkup @@ -20,7 +20,7 @@ external interface MarkupProps : Props { var markup: VisionOfMarkup? } -val Markup = functionComponent("Markup") { props -> +val Markup = fc("Markup") { props -> val elementRef = useRef(null) useEffect(props.markup, elementRef) { diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index ee896df2..5a2c6a81 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -14,7 +14,7 @@ external interface PlotlyProps : Props { } -val Plotly = functionComponent("Plotly") { props -> +val Plotly = fc("Plotly") { props -> val elementRef = useRef(null) useEffect(props.plot, elementRef) { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 0ef8f166..d33cd455 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -52,8 +52,6 @@ kotlin { jsMain { dependencies { implementation(project(":ui:ring")) - implementation(npmlibs.ktor.client.js) - implementation(npmlibs.ktor.client.serialization) implementation(project(":visionforge-threejs")) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 30a79315..879f6af7 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -1,17 +1,19 @@ package ru.mipt.npm.muon.monitor -import io.ktor.client.HttpClient -import io.ktor.client.request.get +import kotlinx.browser.window import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.await import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction +import kotlinx.serialization.json.Json +import org.w3c.fetch.RequestInit import react.Props import react.dom.attrs import react.dom.button import react.dom.p -import react.functionComponent +import react.fc import react.useMemo import react.useState import space.kscience.dataforge.context.Context @@ -31,13 +33,12 @@ import kotlin.math.PI external interface MMAppProps : Props { var model: Model var context: Context - var connection: HttpClient var selected: Name? } @OptIn(DelicateCoroutinesApi::class) @JsExport -val MMApp = functionComponent("Muon monitor") { props -> +val MMApp = fc("Muon monitor") { props -> val mmOptions = useMemo { Canvas3DOptions { @@ -75,9 +76,21 @@ val MMApp = functionComponent("Muon monitor") { props -> attrs { onClickFunction = { context.launch { - val event = props.connection.get( - "http://localhost:8080/event" - ) +// val event = props.connection.get( +// "http://localhost:8080/event" +// ) + val event = window.fetch( + "http://localhost:8080/event", + RequestInit("GET") + ).then { response -> + if (response.ok) { + response.text() + } else { + error("Failed to get event") + } + }.then { body -> + Json.decodeFromString(Event.serializer(), body) + }.await() events = events + event props.model.displayEvent(event) } @@ -102,7 +115,7 @@ val MMApp = functionComponent("Muon monitor") { props -> } +" : " styledSpan { - css{ + css { color = Color.blue } +event.hits.toString() diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index f777d383..6b611146 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,10 +1,6 @@ package ru.mipt.npm.muon.monitor -import io.ktor.client.HttpClient -import io.ktor.client.features.json.JsonFeature -import io.ktor.client.features.json.serializer.KotlinxSerializer import kotlinx.browser.document -import react.child import react.dom.render import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch @@ -15,15 +11,9 @@ import space.kscience.visionforge.startApplication private class MMDemoApp : Application { - private val connection = HttpClient { - install(JsonFeature) { - serializer = KotlinxSerializer() - } - } - override fun start(state: Map) { - val context = Context("MM-demo"){ + val context = Context("MM-demo") { plugin(ThreePlugin) } val visionManager = context.fetch(VisionManager) @@ -35,7 +25,6 @@ private class MMDemoApp : Application { child(MMApp) { attrs { this.model = model - this.connection = this@MMDemoApp.connection this.context = context } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 3a360ce7..93f2ec7c 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -35,7 +35,7 @@ fun main() { } } - server.show() + server.openInBrowser() GlobalScope.launch { while (isActive) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e..2e6e5897 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index b20e2b0e..0d4e2dc7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -9,12 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.FunctionComponent +import react.FC import react.Props import react.RBuilder import react.dom.attrs import react.dom.button -import react.functionComponent +import react.fc import space.kscience.dataforge.meta.withDefault import space.kscience.visionforge.Vision import space.kscience.visionforge.encodeToString @@ -47,7 +47,7 @@ public external interface CanvasControlsProps : Props { public var vision: Vision? } -public val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> +public val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { css { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index fc58fed7..07bd9b55 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -18,7 +18,7 @@ public external interface TabProps : PropsWithChildren { } @JsExport -public val Tab: FunctionComponent = functionComponent { props -> +public val Tab: FC = fc { props -> props.children() } @@ -27,7 +27,7 @@ public external interface TabPaneProps : PropsWithChildren { } @JsExport -public val TabPane: FunctionComponent = functionComponent("TabPane") { props -> +public val TabPane: FC = fc("TabPane") { props -> var activeTab: String? by useState(props.activeTab) val children: Array = Children.map(props.children) { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index deda16d7..e7602b0e 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -2,11 +2,11 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border -import react.FunctionComponent +import react.FC import react.PropsWithChildren import react.RBuilder import react.dom.h2 -import react.functionComponent +import react.fc import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision @@ -24,7 +24,7 @@ public external interface ThreeControlsProps : PropsWithChildren { } @JsExport -public val ThreeControls: FunctionComponent = functionComponent { props -> +public val ThreeControls: FC = fc { props -> tabPane(if (props.selected != null) "Properties" else null) { tab("Canvas") { card("Canvas configuration") { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 7d41bde9..651c9d31 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -42,7 +42,7 @@ public external interface MetaViewerProps : Props { public var descriptor: MetaDescriptor? } -private val MetaViewerItem: FunctionComponent = functionComponent("MetaViewerItem") { props -> +private val MetaViewerItem: FC = fc("MetaViewerItem") { props -> metaViewerItem(props) } @@ -127,7 +127,7 @@ private fun RBuilder.metaViewerItem(props: MetaViewerProps) { } @JsExport -public val MetaViewer: FunctionComponent = functionComponent("MetaViewer") { props -> +public val MetaViewer: FC = fc("MetaViewer") { props -> child(MetaViewerItem) { attrs { this.key = "" diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 5dd44099..e9cf62bf 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -76,110 +76,109 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styled } @JsExport -public val ThreeCanvasWithControls: FunctionComponent = - functionComponent("ThreeViewWithControls") { props -> - var selected by useState { props.selected } - var solid: Solid? by useState(null) +public val ThreeCanvasWithControls: FC = fc("ThreeViewWithControls") { props -> + var selected by useState { props.selected } + var solid: Solid? by useState(null) - useEffect { - props.context.launch { - solid = props.builderOfSolid.await().also { - it?.root(props.context.visionManager) - } - } - } - - val onSelect: (Name?) -> Unit = { - selected = it - } - - val options = useMemo(props.options) { - (props.options?: Canvas3DOptions()).apply { - this.onSelect = onSelect - } - } - - val selectedVision: Vision? = useMemo(props.builderOfSolid, selected) { - selected?.let { - when { - it.isEmpty() -> solid - else -> (solid as? VisionGroup)?.get(it) - } - } - } - - - flexRow { - css { - height = 100.pct - width = 100.pct - flexWrap = FlexWrap.wrap - alignItems = Align.stretch - alignContent = Align.stretch - } - - flexColumn { - css { - height = 100.pct - minWidth = 600.px - flex(10.0, 1.0, FlexBasis("600px")) - position = Position.relative - } - - if (solid == null) { - LoaderScreen { - attrs { - message = "Loading Three vision" - } - } - } else { - child(ThreeCanvasComponent) { - attrs { - this.context = props.context - this.solid = solid - this.selected = selected - this.options = options - } - } - } - - selectedVision?.let { vision -> - styledDiv { - css { - position = Position.absolute - top = 5.px - right = 5.px - width = 450.px - } - Island { - IslandHeader { - attrs { - border = true - } - nameCrumbs(selected) { selected = it } - } - IslandContent { - propertyEditor( - ownProperties = vision.meta, - allProperties = vision.computeProperties(), - descriptor = vision.descriptor, - key = selected - ) - } - } - } - } - } - flexColumn { - css { - padding(4.px) - minWidth = 400.px - height = 100.pct - overflowY = Overflow.auto - flex(1.0, 10.0, FlexBasis("300px")) - } - ringThreeControls(options, solid, selected, onSelect, additionalTabs = props.additionalTabs) + useEffect { + props.context.launch { + solid = props.builderOfSolid.await().also { + it?.root(props.context.visionManager) } } } + val onSelect: (Name?) -> Unit = { + selected = it + } + + val options = useMemo(props.options) { + (props.options ?: Canvas3DOptions()).apply { + this.onSelect = onSelect + } + } + + val selectedVision: Vision? = useMemo(props.builderOfSolid, selected) { + selected?.let { + when { + it.isEmpty() -> solid + else -> (solid as? VisionGroup)?.get(it) + } + } + } + + + flexRow { + css { + height = 100.pct + width = 100.pct + flexWrap = FlexWrap.wrap + alignItems = Align.stretch + alignContent = Align.stretch + } + + flexColumn { + css { + height = 100.pct + minWidth = 600.px + flex(10.0, 1.0, FlexBasis("600px")) + position = Position.relative + } + + if (solid == null) { + LoaderScreen { + attrs { + message = "Loading Three vision" + } + } + } else { + child(ThreeCanvasComponent) { + attrs { + this.context = props.context + this.solid = solid + this.selected = selected + this.options = options + } + } + } + + selectedVision?.let { vision -> + styledDiv { + css { + position = Position.absolute + top = 5.px + right = 5.px + width = 450.px + } + Island { + IslandHeader { + attrs { + border = true + } + nameCrumbs(selected) { selected = it } + } + IslandContent { + propertyEditor( + ownProperties = vision.meta, + allProperties = vision.computeProperties(), + descriptor = vision.descriptor, + key = selected + ) + } + } + } + } + } + flexColumn { + css { + padding(4.px) + minWidth = 400.px + height = 100.pct + overflowY = Overflow.auto + flex(1.0, 10.0, FlexBasis("300px")) + } + ringThreeControls(options, solid, selected, onSelect, additionalTabs = props.additionalTabs) + } + } +} + diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index eed656e6..68cc13b2 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -9,12 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.FunctionComponent +import react.FC import react.Props import react.RBuilder import react.dom.attrs import react.dom.button -import react.functionComponent +import react.fc import ringui.Island import ringui.SmartTabs import ringui.Tab @@ -52,7 +52,7 @@ internal external interface CanvasControlsProps : Props { public var vision: Vision? } -internal val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> +internal val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { css { @@ -94,7 +94,7 @@ public external interface ThreeControlsProps : Props { } @JsExport -public val ThreeControls: FunctionComponent = functionComponent { props -> +public val ThreeControls: FC = fc { props -> SmartTabs("Tree") { props.vision?.let { Tab("Tree") { diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index b411dee9..ecd14331 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -15,7 +15,7 @@ kotlin { commonMain { dependencies { api("space.kscience:dataforge-context:$dataforgeVersion") - api("org.jetbrains.kotlinx:kotlinx-html:${ru.mipt.npm.gradle.KScienceVersions.htmlVersion}") + api(npmlibs.kotlinx.html) api("org.jetbrains.kotlin-wrappers:kotlin-css") } } diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 18fda1cf..ec77fa22 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -2,12 +2,9 @@ plugins { id("ru.mipt.npm.gradle.jvm") } -val ktorVersion = ru.mipt.npm.gradle.KScienceVersions.ktorVersion - dependencies { api(project(":visionforge-core")) - api("io.ktor:ktor-server-cio:$ktorVersion") - //api("io.ktor:ktor-server-netty:$ktorVersion") - api("io.ktor:ktor-html-builder:$ktorVersion") - api("io.ktor:ktor-websockets:$ktorVersion") + api(npmlibs.ktor.server.cio) + api(npmlibs.ktor.html.builder) + api(npmlibs.ktor.websockets) } \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 61c3fd84..82b27952 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -38,10 +38,7 @@ import space.kscience.visionforge.html.* import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI -import kotlin.collections.set -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime /** @@ -53,10 +50,30 @@ public class VisionServer internal constructor( private val rootRoute: String, ) : Configurable, CoroutineScope by application { override val meta: ObservableMutableMeta = MutableMeta() + + /** + * Update minimal interval between updates in milliseconds (if there are no updates, push will not happen + */ public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) + + /** + * Cache page fragments. If false, pages will be reconstructed on each call. Default: `true` + */ public var cacheFragments: Boolean by meta.boolean(true) + + /** + * Embed the initial state of the vision inside its html tag. Default: `true` + */ public var dataEmbed: Boolean by meta.boolean(true, Name.parse("data.embed")) + + /** + * Fetch data on vision load. Overrides embedded data. Default: `false` + */ public var dataFetch: Boolean by meta.boolean(false, Name.parse("data.fetch")) + + /** + * Connect to server to get pushes. The address of the server is embedded in the tag. Default: `true` + */ public var dataConnect: Boolean by meta.boolean(true, Name.parse("data.connect")) /** @@ -64,6 +81,9 @@ public class VisionServer internal constructor( */ private val globalHeaders: ArrayList = ArrayList() + /** + * Add a header to all pages produced by this server + */ public fun header(block: TagConsumer<*>.() -> Unit) { globalHeaders.add(block) } @@ -73,7 +93,7 @@ public class VisionServer internal constructor( headers: List, visionFragment: HtmlVisionFragment, ): Map { - var visionMap: Map? = null + var visionMap: Map? = null head { meta { @@ -102,7 +122,7 @@ public class VisionServer internal constructor( * Server a map of visions without providing explicit html page for them */ @OptIn(DFExperimental::class) - public fun serveVisions(route: Route, visions: Map): Unit = route { + internal fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") //Update websocket @@ -158,8 +178,13 @@ public class VisionServer internal constructor( * Create a static html page and serve visions produced in the process */ @DFExperimental - public fun createHtmlAndServe(route: String, title: String, headers: List, visionFragment: HtmlVisionFragment): String{ - val htmlString = createHTML().apply { + public fun createHtmlAndServe( + route: String, + title: String, + headers: List, + visionFragment: HtmlVisionFragment, + ): String { + val htmlString = createHTML().apply { html { visionPage(title, headers, visionFragment).also { serveVisions(route, it) @@ -171,7 +196,7 @@ public class VisionServer internal constructor( } /** - * Serv visions in a given [route] without providing a page template + * Serve visions in a given [route] without providing a page template */ public fun serveVisions(route: String, visions: Map): Unit { application.routing { @@ -245,6 +270,9 @@ public inline fun VisionServer.useScript(src: String, crossinline block: SCRIPT. } } +/** + * Use css with given stylesheet link as a global header for all pages. + */ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() -> Unit = {}) { header { link { @@ -256,7 +284,7 @@ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() - } /** - * Attach plotly application to given server + * Attach VisionForge server application to given server */ public fun Application.visionServer(context: Context, route: String = DEFAULT_PAGE): VisionServer { if (featureOrNull(WebSockets) == null) { @@ -286,6 +314,9 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA return VisionServer(visionManager, this, route) } +/** + * Start a stand-alone VisionForge server at given host/port + */ public fun VisionManager.serve( host: String = "localhost", port: Int = 7777, @@ -294,10 +325,16 @@ public fun VisionManager.serve( visionServer(context).apply(block) }.start() -public fun ApplicationEngine.show() { +/** + * Connect to a given Ktor server using browser + */ +public fun ApplicationEngine.openInBrowser() { val connector = environment.connectors.first() val uri = URI("http", null, connector.host, connector.port, null, null, null) Desktop.getDesktop().browse(uri) } +/** + * Stop the server with default timeouts + */ public fun ApplicationEngine.close(): Unit = stop(1000, 5000) \ No newline at end of file -- 2.34.1 From 6b8e166978af9b0cc1ec8e0d989bb7c5fb13be47 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 31 Dec 2021 13:59:27 +0300 Subject: [PATCH 049/143] Forms implemented --- .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- demo/jupyter-playground/build.gradle.kts | 35 ------ .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 4 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 3 - demo/playground/build.gradle.kts | 28 +++-- .../kotlin/VisionForgePlayGroundForJupyter.kt | 37 +++---- .../src/jvmMain/kotlin/formServer.kt | 67 ++++++++++++ .../kotlin/{gdmCurve.kt => gdmlCurve.kt} | 2 +- .../src/jvmMain/kotlin/generateSchema.kt | 20 ++-- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 2 - .../src/jvmMain/kotlin/JupyterPluginBase.kt | 7 -- settings.gradle.kts | 1 - .../ThreeViewWithControls.kt | 2 +- .../space/kscience/visionforge/VisionBase.kt | 2 +- .../kscience/visionforge/VisionChange.kt | 36 ++++--- .../kscience/visionforge/VisionGroupBase.kt | 5 +- .../kscience/visionforge/VisionManager.kt | 8 ++ .../visionforge/html/VisionOfHtmlForm.kt | 26 +++++ .../visionforge/html/VisionOfHtmlInput.kt | 53 +++++++++ .../visionforge/html/VisionTagConsumer.kt | 6 +- .../visionforge/ElementVisionRenderer.kt | 74 +++++++++++++ .../kscience/visionforge/VisionClient.kt | 18 +++- .../kscience/visionforge/elementOutput.kt | 27 ----- .../kscience/visionforge/inputRenderers.kt | 101 ++++++++++++++++++ .../space/kscience/visionforge/FormTest.kt | 22 ++++ .../visionforge/three/server/VisionServer.kt | 2 +- .../visionforge/solid/VisionUpdateTest.kt | 4 +- 27 files changed, 445 insertions(+), 151 deletions(-) delete mode 100644 demo/jupyter-playground/build.gradle.kts rename demo/{jupyter-playground/src/main => playground/src/jvmMain}/kotlin/VisionForgePlayGroundForJupyter.kt (71%) create mode 100644 demo/playground/src/jvmMain/kotlin/formServer.kt rename demo/playground/src/jvmMain/kotlin/{gdmCurve.kt => gdmlCurve.kt} (99%) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt create mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt delete mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt create mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt create mode 100644 visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index e5787050..823297ec 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -21,7 +21,7 @@ import space.kscience.visionforge.gdml.markLayers import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import styled.css @@ -50,7 +50,7 @@ val GDMLApp = fc("GDMLApp") { props -> name.endsWith(".gdml") || name.endsWith(".xml") -> { val gdml = Gdml.decodeFromString(data) gdml.toVision().apply { - root(visionManager) + setAsRoot(visionManager) console.info("Marking layers for file $name") markLayers() } diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts deleted file mode 100644 index 62f92348..00000000 --- a/demo/jupyter-playground/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -plugins { - kotlin("jvm") - kotlin("jupyter.api") - id("com.github.johnrengelman.shadow") version "6.1.0" -} - -repositories { - jcenter() - mavenCentral() - maven("https://repo.kotlin.link") -} - -dependencies { - implementation(project(":demo:playground")) -} - -tasks.withType { - kotlinOptions { - jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() - } -} - -extensions.findByType()?.apply { - targetCompatibility = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET -} - -tasks.withType { - useJUnitPlatform() -} - -tasks.processJupyterApiResources { - libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") -} - -tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 0c5e0af0..2dab49a2 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -5,7 +5,7 @@ import ru.mipt.npm.muon.monitor.Monitor.LOWER_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.UPPER_LAYER_Z import space.kscience.visionforge.VisionManager import space.kscience.visionforge.removeAll -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.* import kotlin.math.PI @@ -37,7 +37,7 @@ class Model(val manager: VisionManager) { var tracks: SolidGroup val root: SolidGroup = SolidGroup().apply { - root(this@Model.manager) + setAsRoot(this@Model.manager) material { wireframe color("darkgreen") diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 879f6af7..558317cb 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -76,9 +76,6 @@ val MMApp = fc("Muon monitor") { props -> attrs { onClickFunction = { context.launch { -// val event = props.connection.get( -// "http://localhost:8080/event" -// ) val event = window.fetch( "http://localhost:8080/event", RequestInit("GET") diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index f06c209e..aa9e7c07 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -1,14 +1,13 @@ plugins { kotlin("multiplatform") + kotlin("jupyter.api") + id("com.github.johnrengelman.shadow") version "7.1.2" } -repositories{ - jcenter() - maven("https://kotlin.bintray.com/kotlinx") - maven("https://dl.bintray.com/kotlin/kotlin-eap") - maven("https://dl.bintray.com/mipt-npm/dataforge") - maven("https://dl.bintray.com/mipt-npm/kscience") - maven("https://dl.bintray.com/mipt-npm/dev") +repositories { + mavenCentral() + maven("https://jitpack.io") + maven("https://repo.kotlin.link") } kotlin { @@ -27,7 +26,8 @@ kotlin { binaries.executable() } - jvm{ + jvm { + withJava() compilations.all { kotlinOptions.jvmTarget = "11" } @@ -37,7 +37,7 @@ kotlin { } afterEvaluate { - val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") + val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") tasks.getByName("jvmProcessResources") { dependsOn(jsBrowserDistribution) @@ -59,14 +59,14 @@ kotlin { } } - val jsMain by getting{ + val jsMain by getting { dependencies { api(project(":ui:ring")) api(project(":visionforge-threejs")) } } - val jvmMain by getting{ + val jvmMain by getting { dependencies { api(project(":visionforge-server")) api("ch.qos.logback:logback-classic:1.2.3") @@ -75,3 +75,9 @@ kotlin { } } } + +tasks.withType { + libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") +} + +tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 71% rename from demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt rename to demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 5ada35ec..b820cf71 100644 --- a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,12 +1,9 @@ -package playground +package space.kscience.visionforge.examples -import kotlinx.html.div -import kotlinx.html.id -import kotlinx.html.script import kotlinx.html.stream.createHTML -import kotlinx.html.unsafe import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.* +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml @@ -15,7 +12,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedVisionFragment +import space.kscience.visionforge.html.embedAndRenderVisionFragment import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids @@ -29,27 +26,19 @@ public class VisionForgePlayGroundForJupyter : JupyterIntegration() { plugin(PlotlyPlugin) } - private val jsBundle = ResourceFallbacksBundle(listOf( - ResourceLocation("js/visionforge-playground.js", ResourcePathType.CLASSPATH_PATH)) - ) - private val jsResource = LibraryResource(name = "VisionForge", type = ResourceType.JS, bundles = listOf(jsBundle)) - private var counter = 0 - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().div { - val id = "visionforge.vision[${counter++}]" - div { - this.id = id - embedVisionFragment(context.visionManager, fragment = fragment) - } - script { - type = "text/javascript" - unsafe { +"window.renderAllVisionsById(\"$id\");" } - } - } + private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) + }.finalize() override fun Builder.onLoaded() { - resource(jsResource) + + resources { + js("VisionForge"){ + classPath("js/visionforge-playground.js") + } + } import( "space.kscience.gdml.*", diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt new file mode 100644 index 00000000..bdc95017 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -0,0 +1,67 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.* +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.visionOfForm +import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.three.server.close +import space.kscience.visionforge.three.server.openInBrowser +import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.three.server.useScript + +fun main() { + val visionManager = Global.fetch(VisionManager) + + val server = visionManager.serve { + useScript("js/visionforge-playground.js") + page { + val form = visionOfForm("form") { + label { + htmlFor = "fname" + +"First name:" + } + br() + input { + type = InputType.text + id = "fname" + name = "fname" + value = "John" + } + br() + label { + htmlFor = "lname" + +"Last name:" + } + br() + input { + type = InputType.text + id = "lname" + name = "lname" + value = "Doe" + } + br() + br() + input { + type = InputType.submit + value = "Submit" + } + } + + vision("form".asName(), form) + form.onPropertyChange { + println(this) + } + } + } + + server.openInBrowser() + + while (readln() != "exit") { + + } + + server.close() +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt similarity index 99% rename from demo/playground/src/jvmMain/kotlin/gdmCurve.kt rename to demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index cbdac68a..1a646d97 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -226,7 +226,7 @@ fun main() { } } }.toVision { - configure { parent, solid, material -> + configure { _, solid, _ -> //disable visibility for the world box if(solid.name == "world"){ visible = false diff --git a/demo/playground/src/jvmMain/kotlin/generateSchema.kt b/demo/playground/src/jvmMain/kotlin/generateSchema.kt index 75c6f9cd..8331ac62 100644 --- a/demo/playground/src/jvmMain/kotlin/generateSchema.kt +++ b/demo/playground/src/jvmMain/kotlin/generateSchema.kt @@ -6,16 +6,18 @@ import kotlinx.serialization.json.Json import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.Solids +private val json = Json { + serializersModule = Solids.serializersModuleForSolids + prettyPrintIndent = " " + prettyPrint = true + ignoreUnknownKeys = true + isLenient = true + coerceInputValues = true + encodeDefaults = true +} + @ExperimentalSerializationApi fun main() { - val schema = Json { - serializersModule = Solids.serializersModuleForSolids - prettyPrintIndent = " " - prettyPrint = true - ignoreUnknownKeys = true - isLenient = true - coerceInputValues = true - encodeDefaults = true - }.encodeToSchema(SolidGroup.serializer(), generateDefinitions = false) + val schema = json.encodeToSchema(SolidGroup.serializer(), generateDefinitions = false) println(schema) } \ No newline at end of file diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index 546c7b51..93650fb2 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -1,13 +1,11 @@ package ru.mipt.npm.sat import space.kscience.dataforge.meta.set -import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.solid.* import space.kscience.visionforge.style import space.kscience.visionforge.useStyle import kotlin.math.PI -@DFExperimental internal fun visionOfSatellite( layers: Int = 10, layerHeight: Number = 10, diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt index f912a88f..e071ac45 100644 --- a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -6,7 +6,6 @@ import io.ktor.server.engine.embeddedServer import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration -import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.get @@ -53,12 +52,6 @@ public abstract class JupyterPluginBase( server = null } - resources { - js("three") { - classPath("js/gdml-jupyter.js") - } - } - import( "kotlinx.html.*", "space.kscience.visionforge.html.Page", diff --git a/settings.gradle.kts b/settings.gradle.kts index fb02e336..dc65b446 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -59,7 +59,6 @@ include( ":demo:muon-monitor", ":demo:sat-demo", ":demo:playground", - ":demo:jupyter-playground", ":demo:plotly-fx", ":demo:js-playground", ":jupyter:visionforge-jupyter-base", diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index e9cf62bf..97c9a083 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -83,7 +83,7 @@ public val ThreeCanvasWithControls: FC = fc("Three useEffect { props.context.launch { solid = props.builderOfSolid.await().also { - it?.root(props.context.visionManager) + it?.setAsRoot(props.context.visionManager) } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 6e2e95d0..003fec79 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -109,7 +109,7 @@ public open class VisionBase( override fun hashCode(): Int = Meta.hashCode(this) } - override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) + final override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) override fun getPropertyValue( name: Name, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index c4f18712..ad0d0d70 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -14,6 +14,17 @@ import space.kscience.dataforge.values.Null import kotlin.jvm.Synchronized import kotlin.time.Duration +/** + * Create a deep copy of given Vision without external connections. + */ +private fun Vision.deepCopy(): Vision { + //Assuming that unrooted visions are already isolated + val manager = this.manager ?: return this + //TODO replace by efficient deep copy + val json = manager.encodeToJsonElement(this) + return manager.decodeFromJson(json) +} + /** * An update for a [Vision] or a [VisionGroup] */ @@ -50,20 +61,14 @@ public class VisionChangeBuilder : VisionContainerBuilder { /** * Isolate collected changes by creating detached copies of given visions */ - public fun isolate(manager: VisionManager): VisionChange = VisionChange( + public fun deepCopy(): VisionChange = VisionChange( reset, - vision?.isolate(manager), + vision?.deepCopy(), if (propertyChange.isEmpty()) null else propertyChange.seal(), - if (children.isEmpty()) null else children.mapValues { it.value.isolate(manager) } + if (children.isEmpty()) null else children.mapValues { it.value.deepCopy() } ) } -private fun Vision.isolate(manager: VisionManager): Vision { - //TODO replace by efficient deep copy - val json = manager.encodeToJsonElement(this) - return manager.decodeFromJson(json) -} - /** * @param delete flag showing that this vision child should be removed * @param vision a new value for vision content @@ -78,8 +83,8 @@ public data class VisionChange( public val children: Map? = null, ) -public inline fun VisionChange(manager: VisionManager, block: VisionChangeBuilder.() -> Unit): VisionChange = - VisionChangeBuilder().apply(block).isolate(manager) +public inline fun VisionChange(block: VisionChangeBuilder.() -> Unit): VisionChange = + VisionChangeBuilder().apply(block).deepCopy() @OptIn(DFExperimental::class) @@ -115,9 +120,10 @@ private fun CoroutineScope.collectChange( } } -@DFExperimental +/** + * Generate a flow of changes of this vision and its children + */ public fun Vision.flowChanges( - manager: VisionManager, collectionDuration: Duration, ): Flow = flow { @@ -126,7 +132,7 @@ public fun Vision.flowChanges( collectChange(Name.EMPTY, this@flowChanges) { collector } //Send initial vision state - val initialChange = VisionChange(vision = isolate(manager)) + val initialChange = VisionChange(vision = deepCopy()) emit(initialChange) while (currentCoroutineContext().isActive) { @@ -135,7 +141,7 @@ public fun Vision.flowChanges( //Propagate updates only if something is changed if (!collector.isEmpty()) { //emit changes - emit(collector.isolate(manager)) + emit(collector.deepCopy()) //Reset the collector collector = VisionChangeBuilder() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index e8594df2..873b5996 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -160,8 +160,9 @@ public open class VisionGroupBase( internal class RootVisionGroup(override val manager: VisionManager) : VisionGroupBase() /** - * Designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent + * Designate this [VisionGroup] as a root and assign a [VisionManager] as its parent */ -public fun Vision.root(manager: VisionManager) { +public fun Vision.setAsRoot(manager: VisionManager) { + if (parent != null) error("This Vision already has a parent. It could not be set as root") parent = RootVisionGroup(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index ff4c29e1..118fd47c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -13,6 +13,10 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.toJson import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.names.Name +import space.kscience.visionforge.html.VisionOfCheckbox +import space.kscience.visionforge.html.VisionOfHtmlForm +import space.kscience.visionforge.html.VisionOfNumberField +import space.kscience.visionforge.html.VisionOfTextField import kotlin.reflect.KClass public class VisionManager(meta: Meta) : AbstractPlugin(meta) { @@ -66,6 +70,10 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { default { VisionBase.serializer() } subclass(VisionBase.serializer()) subclass(VisionGroupBase.serializer()) + subclass(VisionOfNumberField.serializer()) + subclass(VisionOfTextField.serializer()) + subclass(VisionOfCheckbox.serializer()) + subclass(VisionOfHtmlForm.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt new file mode 100644 index 00000000..a3070e58 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -0,0 +1,26 @@ +package space.kscience.visionforge.html + +import kotlinx.html.FORM +import kotlinx.html.TagConsumer +import kotlinx.html.form +import kotlinx.html.id +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.node + +@Serializable +@SerialName("html.form") +public class VisionOfHtmlForm( + public val formId: String, +) : VisionOfHtmlInput() { + public var values: Meta? by meta.node() +} + +public inline fun TagConsumer.visionOfForm(id: String, crossinline builder: FORM.() -> Unit): VisionOfHtmlForm { + form { + this.id = id + builder() + } + return VisionOfHtmlForm(id) +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt new file mode 100644 index 00000000..084c5b6b --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt @@ -0,0 +1,53 @@ +package space.kscience.visionforge.html + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.number +import space.kscience.dataforge.meta.string +import space.kscience.visionforge.VisionBase + +@Serializable +public abstract class VisionOfHtmlInput : VisionBase() { + public var disabled: Boolean by meta.boolean(false) +} + +@Serializable +@SerialName("html.text") +public class VisionOfTextField( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var text: String? by meta.string() +} + +@Serializable +@SerialName("html.checkbox") +public class VisionOfCheckbox( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var checked: Boolean? by meta.boolean() +} + +@Serializable +@SerialName("html.number") +public class VisionOfNumberField( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var value: Number? by meta.number() +} + +@Serializable +@SerialName("html.range") +public class VisionOfRangeField( + public val min: Double, + public val max: Double, + public val step: Double = 1.0, + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var value: Number? by meta.number() +} + diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 27725721..c047222b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -11,7 +11,7 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import kotlin.collections.set @DslMarker @@ -81,11 +81,11 @@ public abstract class VisionTagConsumer( @OptIn(DFExperimental::class) public inline fun TagConsumer.vision( name: Name, - visionProvider: VisionOutput.() -> Vision, + @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, ): T { val output = VisionOutput(manager) val vision = output.visionProvider() - vision.root(manager) + vision.setAsRoot(manager) return vision(name, vision, output.meta) } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt new file mode 100644 index 00000000..bf9f00df --- /dev/null +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -0,0 +1,74 @@ +package space.kscience.visionforge + +import kotlinx.dom.clear +import kotlinx.html.TagConsumer +import kotlinx.html.dom.append +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.serializerOrNull +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.misc.Type +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName +import kotlin.reflect.KClass +import kotlin.reflect.cast + +/** + * A browser renderer for a [Vision]. + */ +@Type(ElementVisionRenderer.TYPE) +public interface ElementVisionRenderer : Named { + + /** + * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer + * can't process a vision. The value of [DEFAULT_RATING] used for default renderer. Specialized renderers could specify + * higher value in order to "steal" rendering job + */ + public fun rateVision(vision: Vision): Int + + /** + * Display the [vision] inside a given [element] replacing its current content. + * @param meta additional parameters for rendering container + */ + public fun render(element: Element, vision: Vision, meta: Meta = Meta.EMPTY) + + public companion object { + public const val TYPE: String = "elementVisionRenderer" + public const val ZERO_RATING: Int = 0 + public const val DEFAULT_RATING: Int = 10 + } +} + +/** + * A browser renderer for element of given type + */ +public class SingleTypeVisionRenderer( + public val kClass: KClass, + private val acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, + private val renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, +) : ElementVisionRenderer { + + @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) + override val name: Name + get() = kClass.serializerOrNull()?.descriptor?.serialName?.parseAsName() + ?: kClass.toString().asName() + + override fun rateVision(vision: Vision): Int = + if (vision::class == kClass) acceptRating else ElementVisionRenderer.ZERO_RATING + + override fun render(element: Element, vision: Vision, meta: Meta) { + element.clear() + element.append { + renderFunction(kClass.cast(vision), meta) + } + } +} + +public inline fun ElementVisionRenderer( + acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, + noinline renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, +): ElementVisionRenderer = SingleTypeVisionRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 60f7a627..c236a19d 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -10,6 +10,9 @@ import org.w3c.dom.url.URL import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.RENDER_FUNCTION_NAME import space.kscience.visionforge.html.VisionTagConsumer import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE @@ -19,6 +22,9 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_A import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds +/** + * A Kotlin-browser plugin that renders visions based on provided renderers and governs communication with the server. + */ public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val visionManager: VisionManager by require(VisionManager) @@ -102,10 +108,12 @@ public class VisionClient : AbstractPlugin() { //Backward change propagation var feedbackJob: Job? = null + //Feedback changes aggregation time in milliseconds + val feedbackAggregationTime = meta["aggregationTime"]?.int ?: 300 + onopen = { feedbackJob = vision.flowChanges( - visionManager, - 300.milliseconds + feedbackAggregationTime.milliseconds ).onEach { change -> send(visionManager.encodeToString(change)) }.launchIn(visionManager.context) @@ -180,6 +188,12 @@ public class VisionClient : AbstractPlugin() { } } + override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) mapOf( + numberVisionRenderer.name to numberVisionRenderer, + textVisionRenderer.name to textVisionRenderer, + formVisionRenderer.name to formVisionRenderer + ) else super.content(target) + public companion object : PluginFactory { override fun invoke(meta: Meta, context: Context): VisionClient = VisionClient() diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt deleted file mode 100644 index f85fdabb..00000000 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt +++ /dev/null @@ -1,27 +0,0 @@ -package space.kscience.visionforge - -import org.w3c.dom.Element -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.misc.Type - -@Type(ElementVisionRenderer.TYPE) -public interface ElementVisionRenderer { - - /** - * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer - * can't process a vision. The value of [DEFAULT_RATING] used for default renderer. Specialized renderers could specify - * higher value in order to "steal" rendering job - */ - public fun rateVision(vision: Vision): Int - - /** - * Display the [vision] inside a given [element] replacing its current content - */ - public fun render(element: Element, vision: Vision, meta: Meta = Meta.EMPTY) - - public companion object { - public const val TYPE: String = "elementVisionRenderer" - public const val ZERO_RATING: Int = 0 - public const val DEFAULT_RATING: Int = 10 - } -} \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt new file mode 100644 index 00000000..0d67a821 --- /dev/null +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -0,0 +1,101 @@ +package space.kscience.visionforge + +import kotlinx.browser.document +import kotlinx.html.InputType +import kotlinx.html.js.input +import kotlinx.html.js.label +import kotlinx.html.js.onChangeFunction +import org.w3c.dom.HTMLFormElement +import org.w3c.dom.HTMLInputElement +import org.w3c.dom.get +import org.w3c.xhr.FormData +import space.kscience.dataforge.meta.DynamicMeta +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.valueSequence +import space.kscience.visionforge.html.VisionOfHtmlForm +import space.kscience.visionforge.html.VisionOfNumberField +import space.kscience.visionforge.html.VisionOfTextField + +public val textVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" + vision.label?.let { + label { + htmlFor = name + +it + } + } + input { + type = InputType.text + this.name = name + vision.useProperty(VisionOfTextField::text) { + value = it ?: "" + } + onChangeFunction = { + vision.text = value + } + } +} + +public val numberVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" + vision.label?.let { + label { + htmlFor = name + +it + } + } + input { + type = InputType.text + this.name = name + vision.useProperty(VisionOfNumberField::value) { + value = it?.toDouble() ?: 0.0 + } + onChangeFunction = { + vision.value = value.toDoubleOrNull() + } + } +} + +internal fun FormData.toMeta(): Meta { + @Suppress("UNUSED_VARIABLE") val formData = this + //val res = js("Object.fromEntries(formData);") + val `object` = js("{}") + //language=JavaScript + js(""" + formData.forEach(function(value, key){ + // Reflect.has in favor of: object.hasOwnProperty(key) + if(!Reflect.has(object, key)){ + object[key] = value; + return; + } + if(!Array.isArray(object[key])){ + object[key] = [object[key]]; + } + object[key].push(value); + }); + """) + return DynamicMeta(`object`) +} + +public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + + val form = document.getElementById(vision.formId) as? HTMLFormElement + ?: error("An element with id = '${vision.formId} is not a form") + + console.info("Adding hooks to form '$form'") + + vision.useProperty(VisionOfHtmlForm::values) { values -> + val inputs = form.getElementsByTagName("input") + values?.valueSequence()?.forEach { (token, value) -> + (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() + } + } + + form.onsubmit = { event -> + event.preventDefault() + val formData = FormData(form).toMeta() + console.log(formData.toString()) + vision.values = formData + false + } +} \ No newline at end of file diff --git a/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt new file mode 100644 index 00000000..58bd2b09 --- /dev/null +++ b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt @@ -0,0 +1,22 @@ +package space.kscience.visionforge + +import org.w3c.xhr.FormData +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.stringList +import kotlin.test.Test +import kotlin.test.assertEquals + +class FormTest { + @Test + fun testFormConversion() { + val fd = FormData() + fd.append("a", "22") + fd.append("b", "1") + fd.append("b", "2") + val meta = fd.toMeta() + assertEquals(22, meta["a"].int) + assertEquals(listOf("1","2"), meta["b"]?.stringList) + } + +} \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 82b27952..5065c765 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -144,7 +144,7 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(visionManager, updateInterval.milliseconds).collect { update -> + vision.flowChanges(updateInterval.milliseconds).collect { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index a08085d6..26b4b40d 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -20,7 +20,7 @@ class VisionUpdateTest { val targetVision = SolidGroup { box(200,200,200, name = "origin") } - val dif = VisionChange(visionManager){ + val dif = VisionChange{ group("top") { color(123) box(100,100,100) @@ -36,7 +36,7 @@ class VisionUpdateTest { @Test fun testVisionChangeSerialization(){ - val change = VisionChange(visionManager){ + val change = VisionChange{ group("top") { color(123) box(100,100,100) -- 2.34.1 From 43285de33ccd5f049fed98c45d72f4c4619af3c7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 14:28:24 +0300 Subject: [PATCH 050/143] Update notebooks hierarchy --- demo/playground/build.gradle.kts | 30 ++-- .../kotlin/VisionForgePlayGroundForJupyter.kt | 53 ++----- .../src/jvmMain/kotlin/formServer.kt | 4 +- .../src/jvmMain/kotlin/serverExtensions.kt | 3 +- .../build.gradle.kts | 4 +- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 62 ++++++++ .../kotlin/VisionForgeServerHandler.kt | 81 +++++++++++ .../src/jvmMain/kotlin/JupyterPluginBase.kt | 77 ---------- .../visionforge-jupyter-gdml/build.gradle.kts | 9 +- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 37 +---- settings.gradle.kts | 2 +- ...{HtmlVisionFragment.kt => HtmlFragment.kt} | 8 +- .../visionforge/html/HtmlVisionRenderer.kt | 88 ++++++----- .../space/kscience/visionforge/html/Page.kt | 9 +- .../visionforge/html/VisionOfHtmlForm.kt | 30 +++- .../visionforge/html/VisionTagConsumer.kt | 2 +- .../kscience/visionforge/VisionClient.kt | 2 +- .../kscience/visionforge/inputRenderers.kt | 2 +- .../visionforge/three/server/VisionServer.kt | 137 +++++++++--------- .../solid/three/MeshThreeFactory.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 2 +- .../three/server/serverExtensions.kt | 4 +- 22 files changed, 343 insertions(+), 305 deletions(-) rename jupyter/{visionforge-jupyter-base => jupyter-base}/build.gradle.kts (75%) create mode 100644 jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt create mode 100644 jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt delete mode 100644 jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/{HtmlVisionFragment.kt => HtmlFragment.kt} (64%) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index aa9e7c07..9a845c50 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -29,7 +29,10 @@ kotlin { jvm { withJava() compilations.all { - kotlinOptions.jvmTarget = "11" + kotlinOptions{ + jvmTarget = "11" + freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + } } testRuns["test"].executionTask.configure { useJUnitPlatform() @@ -51,33 +54,34 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - api(project(":visionforge-solid")) - api(project(":visionforge-gdml")) - api(project(":visionforge-plotly")) - api(projects.visionforge.visionforgeMarkdown) - api(projects.visionforge.cernRootLoader) + implementation(projects.visionforgeSolid) + implementation(projects.visionforgeGdml) + implementation(projects.visionforgePlotly) + implementation(projects.visionforgeMarkdown) + implementation(projects.cernRootLoader) + implementation(projects.jupyter.jupyterBase) } } val jsMain by getting { dependencies { - api(project(":ui:ring")) - api(project(":visionforge-threejs")) + implementation(projects.ui.ring) + implementation(projects.visionforgeThreejs) } } val jvmMain by getting { dependencies { - api(project(":visionforge-server")) - api("ch.qos.logback:logback-classic:1.2.3") - api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + implementation(projects.visionforgeServer) + implementation("ch.qos.logback:logback-classic:1.2.3") + implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } } -tasks.withType { +val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class){ libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") } -tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file +tasks.findByName("shadowJar")?.dependsOn(processJupyterApiResources) \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index b820cf71..6cbe311d 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,41 +1,27 @@ package space.kscience.visionforge.examples -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot -import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.jupyter.JupyterPluginBase import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.visionManager @DFExperimental -public class VisionForgePlayGroundForJupyter : JupyterIntegration() { - - private val context = Context("VisionForge") { +internal class VisionForgePlayGroundForJupyter : JupyterPluginBase( + Context("VisionForge") { plugin(Solids) plugin(PlotlyPlugin) } +) { - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - override fun Builder.onLoaded() { - + override fun Builder.afterLoaded() { resources { - js("VisionForge"){ + js("VisionForge") { classPath("js/visionforge-playground.js") } } @@ -44,41 +30,20 @@ public class VisionForgePlayGroundForJupyter : JupyterIntegration() { "space.kscience.gdml.*", "space.kscience.plotly.*", "space.kscience.plotly.models.*", - "kotlinx.html.*", "space.kscience.visionforge.solid.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page" ) + render { gdmlModel -> - val fragment = HtmlVisionFragment { + handler.produceHtml { vision(gdmlModel.toVision()) } - HTML(produceHtmlVisionString(fragment)) - } - - render { vision -> - val fragment = HtmlVisionFragment { - vision(vision) - } - - HTML(produceHtmlVisionString(fragment)) } render { plot -> - val fragment = HtmlVisionFragment { + handler.produceHtml { vision(plot.asVision()) } - - HTML(produceHtmlVisionString(fragment)) - } - - render { fragment -> - HTML(createHTML().apply(fragment.visit).finalize()) - } - - render { page -> - HTML(page.render(createHTML()), true) } } diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index bdc95017..c5276554 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -5,7 +5,7 @@ import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.asName import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.visionOfForm +import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.three.server.close import space.kscience.visionforge.three.server.openInBrowser @@ -18,7 +18,7 @@ fun main() { val server = visionManager.serve { useScript("js/visionforge-playground.js") page { - val form = visionOfForm("form") { + val form = formFragment("form") { label { htmlFor = "fname" +"First name:" diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index e4111afc..6d9ff46c 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -9,6 +9,7 @@ import space.kscience.visionforge.html.scriptHeader import space.kscience.visionforge.makeFile import space.kscience.visionforge.three.server.VisionServer import space.kscience.visionforge.three.server.useScript +import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path @@ -25,7 +26,7 @@ public fun Context.makeVisionFile( show: Boolean = true, content: VisionTagConsumer<*>.() -> Unit ): Unit { - val actualPath = page(title, content = content).makeFile(path) { actualPath -> + val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> mapOf("playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/jupyter/visionforge-jupyter-base/build.gradle.kts b/jupyter/jupyter-base/build.gradle.kts similarity index 75% rename from jupyter/visionforge-jupyter-base/build.gradle.kts rename to jupyter/jupyter-base/build.gradle.kts index 3e5f671d..0b406250 100644 --- a/jupyter/visionforge-jupyter-base/build.gradle.kts +++ b/jupyter/jupyter-base/build.gradle.kts @@ -9,12 +9,12 @@ kotlin { sourceSets { commonMain{ dependencies{ - api(projects.visionforge.visionforgeCore) + api(projects.visionforgeCore) } } jvmMain { dependencies { - implementation(project(":visionforge-server")) + api(projects.visionforgeServer) } } } diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt new file mode 100644 index 00000000..b0422516 --- /dev/null +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -0,0 +1,62 @@ +package space.kscience.visionforge.jupyter + +import kotlinx.html.stream.createHTML +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.declare +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.Vision +import space.kscience.visionforge.html.HtmlFormFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.fragment + +@DFExperimental +public abstract class JupyterPluginBase(final override val context: Context) : JupyterIntegration(), ContextAware { + + protected val handler: VisionForgeServerHandler = VisionForgeServerHandler(context) + + protected abstract fun Builder.afterLoaded() + + final override fun Builder.onLoaded() { + + onLoaded { + declare("visionForge" to handler) + } + + onShutdown { + handler.stopServer() + } + + import( + "kotlinx.html.*", + "space.kscience.visionforge.html.*" + ) + + + render { fragment -> + handler.produceHtml(fragment = fragment) + } + + render { vision -> + handler.produceHtml { + vision(vision) + } + + } + + render { page -> + HTML(page.render(createHTML()), true) + } + + render { fragment -> + handler.produceHtml { + fragment(fragment.formBody) + vision(fragment.vision) + } + } + afterLoaded() + } +} diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt new file mode 100644 index 00000000..a01bdc43 --- /dev/null +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt @@ -0,0 +1,81 @@ +package space.kscience.visionforge.jupyter + +import io.ktor.server.engine.ApplicationEngine +import kotlinx.html.FORM +import kotlinx.html.p +import kotlinx.html.stream.createHTML +import kotlinx.html.style +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.context.info +import space.kscience.dataforge.context.logger +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.string +import space.kscience.visionforge.html.HtmlFormFragment +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.visionFragment +import space.kscience.visionforge.three.server.VisionServer +import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.visionManager + +public class VisionForgeServerHandler(override val context: Context) : ContextAware { + private var counter = 0 + + private var engine: ApplicationEngine? = null + private var server: VisionServer? = null + + public var isolateFragments: Boolean = false + + public fun legacyMode() { + isolateFragments = true + } + + public fun startServer( + host: String = context.properties["visionforge.host"].string ?: "localhost", + port: Int = context.properties["visionforge.port"].int ?: VisionServer.DEFAULT_PORT, + configuration: VisionServer.() -> Unit = {}, + ): HtmlFragment { + engine?.stop(1000, 2000) + engine = context.visionManager.serve(host, port) { + configuration() + server = this + }.start() + return { + if(server!= null){ + p { + style = "color: red;" + +"Stopping current VisionForge server" + } + } + p { + style = "color: blue;" + +"Starting VisionForge server on http://$host:$port" + } + } + } + + public fun stopServer() { + engine?.apply { + logger.info { "Stopping VisionForge server" } + }?.stop(1000, 2000) + } + + private fun produceHtmlString( + fragment: HtmlVisionFragment, + ): String = server?.serveVisionsFromFragment("content[${counter++}]", fragment) + ?: createHTML().apply { + visionFragment(context.visionManager, fragment = fragment) + }.finalize() + + public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = + HTML(produceHtmlString(fragment), isolated ?: isolateFragments) + + public fun fragment(body: HtmlVisionFragment): MimeTypedResult = produceHtml(fragment = body) + public fun page(body: HtmlVisionFragment): MimeTypedResult = produceHtml(true, body) + + public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) +} \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt deleted file mode 100644 index e071ac45..00000000 --- a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ /dev/null @@ -1,77 +0,0 @@ -package space.kscience.visionforge.jupyter - -import io.ktor.server.cio.CIO -import io.ktor.server.engine.ApplicationEngine -import io.ktor.server.engine.embeddedServer -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.Vision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.visionServer -import space.kscience.visionforge.visionManager - -private const val DEFAULT_VISIONFORGE_PORT = 88898 - -@DFExperimental -public abstract class JupyterPluginBase( - override val context: Context, -) : JupyterIntegration(), ContextAware { - - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - private var engine: ApplicationEngine? = null - private var server: VisionServer? = null - - override fun Builder.onLoaded() { - - onLoaded { - val host = context.properties["visionforge.host"].string ?: "localhost" - val port = context.properties["visionforge.port"].int ?: DEFAULT_VISIONFORGE_PORT - engine = context.embeddedServer(CIO, port, host) { - server = visionServer(context) - }.start() - } - - onShutdown { - engine?.stop(1000, 1000) - engine = null - server = null - } - - import( - "kotlinx.html.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page", - ) - - render { vision -> - val server = this@JupyterPluginBase.server - if (server == null) { - HTML(produceHtmlVisionString { vision(vision) }) - } else { - val route = "route.${counter++}" - HTML(server.createHtmlAndServe(route,route, emptyList()){ - vision(vision) - }) - } - } - - render { page -> - //HTML(page.render(createHTML()), true) - } - } -} diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index c2c77516..afb08473 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -32,18 +32,19 @@ kotlin { sourceSets { commonMain { dependencies { - api(project(":visionforge-solid")) + implementation(projects.visionforgeSolid) + implementation(projects.jupyter.jupyterBase) } } jvmMain { dependencies { - implementation(project(":visionforge-gdml")) + implementation(projects.visionforgeGdml) } } jsMain { dependencies { - api(project(":visionforge-threejs")) - implementation(project(":ui:ring")) + implementation(projects.visionforgeThreejs) + implementation(projects.ui.ring) } } diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 2aa1873b..9dc95d6d 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -1,34 +1,21 @@ package space.kscience.visionforge.gdml.jupyter -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml -import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.jupyter.JupyterPluginBase import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.visionManager @DFExperimental -internal class GdmlForJupyter : JupyterIntegration() { - - private val context = Context("GDML") { +internal class GdmlForJupyter : JupyterPluginBase( + Context("GDML") { plugin(Solids) } +) { - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - override fun Builder.onLoaded() { + override fun Builder.afterLoaded() { resources { js("three") { @@ -38,23 +25,11 @@ internal class GdmlForJupyter : JupyterIntegration() { import( "space.kscience.gdml.*", - "kotlinx.html.*", - "space.kscience.visionforge.solid.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page", "space.kscience.visionforge.gdml.jupyter.*" ) - render { vision -> - HTML(produceHtmlVisionString { vision(vision) }) - } - render { gdmlModel -> - HTML(produceHtmlVisionString { vision(gdmlModel.toVision()) }) - } - - render { page -> - HTML(page.render(createHTML()), true) + handler.produceHtml { vision(gdmlModel.toVision()) } } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index dc65b446..6d3e5961 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -61,6 +61,6 @@ include( ":demo:playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:visionforge-jupyter-base", + ":jupyter:jupyter-base", ":jupyter:visionforge-jupyter-gdml" ) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt similarity index 64% rename from visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt rename to visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt index 9be18263..343a29ce 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.html import kotlinx.html.FlowContent import kotlinx.html.TagConsumer import kotlinx.html.stream.createHTML -import space.kscience.dataforge.misc.DFExperimental public typealias HtmlFragment = TagConsumer<*>.() -> Unit @@ -15,9 +14,4 @@ public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { public fun FlowContent.fragment(fragment: HtmlFragment) { fragment(consumer) -} - -public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit - -@DFExperimental -public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content \ No newline at end of file +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 7bfe5012..6ec98684 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -6,26 +6,47 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import kotlin.random.Random +import kotlin.random.nextUInt -public fun TagConsumer<*>.embedVisionFragment( +public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit + +@DFExperimental +public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content + + +internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" + + +/** + * Render a fragment in the given consumer and return a map of extracted visions + * @param manager a VisionManager used for serialization + * @param embedData embed Vision initial state in the HTML + * @param fetchDataUrl fetch data after first render from given url + * @param fetchUpdatesUrl receive push updates from the server at given url + * @param idPrefix a prefix to be used before vision ids + * @param renderScript if true add rendering script after the fragment + */ +public fun TagConsumer<*>.visionFragment( manager: VisionManager, embedData: Boolean = true, - fetchData: String? = null, - fetchUpdates: String? = null, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, idPrefix: String? = null, + renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(this@embedVisionFragment, manager, idPrefix) { + val consumer = object : VisionTagConsumer(this@visionFragment, manager, idPrefix) { override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision // Toggle update mode - fetchUpdates?.let { + fetchUpdatesUrl?.let { attributes[OUTPUT_CONNECT_ATTRIBUTE] = it } - fetchData?.let { + fetchDataUrl?.let { attributes[OUTPUT_FETCH_ATTRIBUTE] = it } @@ -40,39 +61,36 @@ public fun TagConsumer<*>.embedVisionFragment( } } } - fragment(consumer) - return visionMap -} - -public fun FlowContent.embedVisionFragment( - manager: VisionManager, - embedData: Boolean = true, - fetchDataUrl: String? = null, - fetchUpdatesUrl: String? = null, - idPrefix: String? = null, - fragment: HtmlVisionFragment, -): Map = consumer.embedVisionFragment(manager, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, fragment) - - -internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" - -public fun TagConsumer<*>.embedAndRenderVisionFragment( - manager: VisionManager, - id: Any, - embedData: Boolean = true, - fetchData: String? = null, - fetchUpdates: String? = null, - idPrefix: String? = null, - fragment: HtmlVisionFragment, -) { - div { + if (renderScript) { + val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" div { - this.id = id.toString() - embedVisionFragment(manager, embedData, fetchData, fetchUpdates, idPrefix, fragment) + this.id = id + fragment(consumer) } script { type = "text/javascript" unsafe { +"window.${RENDER_FUNCTION_NAME}(\"$id\");" } } + } else { + fragment(consumer) } -} \ No newline at end of file + return visionMap +} + +public fun FlowContent.visionFragment( + manager: VisionManager, + embedData: Boolean = true, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, + idPrefix: String? = null, + renderSctipt: Boolean = true, + fragment: HtmlVisionFragment, +): Map = consumer.visionFragment( + manager, + embedData, + fetchDataUrl, + fetchUpdatesUrl, + idPrefix, + renderSctipt, + fragment +) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index 6e807e92..96cae1ce 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -1,12 +1,11 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.visionManager +import space.kscience.visionforge.VisionManager public data class Page( - public val context: Context, + public val visionManager: VisionManager, public val title: String, public val headers: Map, public val content: HtmlVisionFragment, @@ -22,14 +21,14 @@ public data class Page( title(this@Page.title) } body { - embedVisionFragment(context.visionManager, fragment = content) + visionFragment(visionManager, fragment = content) } }.finalize() } @DFExperimental -public fun Context.page( +public fun VisionManager.page( title: String = "VisionForge page", vararg headers: Pair, content: HtmlVisionFragment, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index a3070e58..0ef6f54e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -7,6 +7,7 @@ import kotlinx.html.id import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node @Serializable @@ -17,10 +18,29 @@ public class VisionOfHtmlForm( public var values: Meta? by meta.node() } -public inline fun TagConsumer.visionOfForm(id: String, crossinline builder: FORM.() -> Unit): VisionOfHtmlForm { - form { - this.id = id - builder() +public class HtmlFormFragment internal constructor( + public val vision: VisionOfHtmlForm, + public val formBody: HtmlFragment, +){ + public val values: Meta? get() = vision.values + public operator fun get(valueName: String): Meta? = values?.get(valueName) +} + +public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment { + val realId = id ?: "form[${builder.hashCode().toUInt()}]" + return HtmlFormFragment(VisionOfHtmlForm(realId)) { + form { + this.id = realId + builder() + } } - return VisionOfHtmlForm(id) +} + +public fun TagConsumer.formFragment( + id: String? = null, + builder: FORM.() -> Unit, +): VisionOfHtmlForm { + val formFragment = HtmlFormFragment(id, builder) + fragment(formFragment.formBody) + return formFragment.vision } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index c047222b..c9bd6857 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -42,7 +42,7 @@ public abstract class VisionTagConsumer( private val idPrefix: String? = null, ) : TagConsumer by root { - public open fun resolveId(name: Name): String = (idPrefix ?: "output:") + name.toString() + public open fun resolveId(name: Name): String = (idPrefix ?: "output") + "[$name]" /** * Render a vision inside the output fragment diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index c236a19d..2bd6dc84 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -164,7 +164,7 @@ public class VisionClient : AbstractPlugin() { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { - pathname += "/vision" + pathname += "/data" } } else { URL(attr.value) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 0d67a821..c6d87b19 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -94,7 +94,7 @@ public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer event.preventDefault() val formData = FormData(form).toMeta() - console.log(formData.toString()) + //console.log(formData.toString()) vision.values = formData false } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 5065c765..b5b78ba0 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -4,12 +4,10 @@ import io.ktor.application.* import io.ktor.features.CORS import io.ktor.features.CallLogging import io.ktor.html.respondHtml -import io.ktor.http.ContentType -import io.ktor.http.HttpStatusCode +import io.ktor.http.* import io.ktor.http.cio.websocket.Frame import io.ktor.http.content.resources import io.ktor.http.content.static -import io.ktor.http.withCharset import io.ktor.response.respond import io.ktor.response.respondText import io.ktor.routing.* @@ -25,8 +23,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* import kotlinx.html.stream.createHTML -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.* import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -34,7 +30,10 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges -import space.kscience.visionforge.html.* +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI @@ -43,12 +42,13 @@ import kotlin.time.Duration.Companion.milliseconds /** * A ktor plugin container with given [routing] + * @param serverUrl a server url including root route */ public class VisionServer internal constructor( private val visionManager: VisionManager, - private val application: Application, - private val rootRoute: String, -) : Configurable, CoroutineScope by application { + private val serverUrl: Url, + private val root: Route, +) : Configurable, CoroutineScope by root.application { override val meta: ObservableMutableMeta = MutableMeta() /** @@ -74,7 +74,7 @@ public class VisionServer internal constructor( /** * Connect to server to get pushes. The address of the server is embedded in the tag. Default: `true` */ - public var dataConnect: Boolean by meta.boolean(true, Name.parse("data.connect")) + public var dataUpdate: Boolean by meta.boolean(true, Name.parse("data.update")) /** * a list of headers that should be applied to all pages @@ -90,6 +90,7 @@ public class VisionServer internal constructor( private fun HTML.visionPage( title: String, + pagePath: String, headers: List, visionFragment: HtmlVisionFragment, ): Map { @@ -106,11 +107,10 @@ public class VisionServer internal constructor( } body { //Load the fragment and remember all loaded visions - visionMap = embedVisionFragment( + visionMap = visionFragment( manager = visionManager, embedData = true, - fetchDataUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, - fetchUpdatesUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fetchUpdatesUrl = "$serverUrl$pagePath/ws", fragment = visionFragment ) } @@ -122,7 +122,7 @@ public class VisionServer internal constructor( * Server a map of visions without providing explicit html page for them */ @OptIn(DFExperimental::class) - internal fun serveVisions(route: Route, visions: Map): Unit = route { + private fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") //Update websocket @@ -157,7 +157,7 @@ public class VisionServer internal constructor( } } //Plots in their json representation - get("vision") { + get("data") { val name: String = call.request.queryParameters["name"] ?: error("Vision name is not defined in parameters") @@ -174,47 +174,40 @@ public class VisionServer internal constructor( } } - /** - * Create a static html page and serve visions produced in the process - */ - @DFExperimental - public fun createHtmlAndServe( - route: String, - title: String, - headers: List, - visionFragment: HtmlVisionFragment, - ): String { - val htmlString = createHTML().apply { - html { - visionPage(title, headers, visionFragment).also { - serveVisions(route, it) - } - } - }.finalize() - - return htmlString - } /** * Serve visions in a given [route] without providing a page template */ public fun serveVisions(route: String, visions: Map): Unit { - application.routing { - route(rootRoute) { - route(route) { - serveVisions(this, visions) - } - } + root.route(route) { + serveVisions(this, visions) } } /** - * Serve a page, potentially containing any number of visions at a given [route] with given [headers]. + * Compile a fragment to string and serve visions from it + */ + public fun serveVisionsFromFragment( + route: String, + fragment: HtmlVisionFragment, + ): String = createHTML().apply { + val visions = visionFragment( + visionManager, + embedData = true, + fetchUpdatesUrl = "$serverUrl$route/ws", + renderScript = true, + fragment = fragment + ) + serveVisions(route, visions) + }.finalize() + + /** + * Serve a page, potentially containing any number of visions at a given [pagePath] with given [headers]. * */ public fun page( - route: String = DEFAULT_PAGE, - title: String = "VisionForge server page '$route'", + pagePath: String = DEFAULT_PAGE, + title: String = "VisionForge server page '$pagePath'", headers: List = emptyList(), visionFragment: HtmlVisionFragment, ) { @@ -223,35 +216,34 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(visionPage(title, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, headers, visionFragment)) } } else { null } - application.routing { - route(rootRoute) { - route(route) { - serveVisions(this, visions) - //filled pages - get { - if (cachedHtml == null) { - //re-create html and vision list on each call - call.respondHtml { - visions.clear() - visions.putAll(visionPage(title, headers, visionFragment)) - } - } else { - //Use cached html - call.respondText(cachedHtml, ContentType.Text.Html.withCharset(Charsets.UTF_8)) - } + root.route(pagePath) { + serveVisions(this, visions) + //filled pages + get { + if (cachedHtml == null) { + //re-create html and vision list on each call + call.respondHtml { + visions.clear() + visions.putAll(visionPage(title, pagePath, headers, visionFragment)) } + } else { + //Use cached html + call.respondText(cachedHtml, ContentType.Text.Html.withCharset(Charsets.UTF_8)) } } } + + } public companion object { + public const val DEFAULT_PORT: Int = 7777 public const val DEFAULT_PAGE: String = "/" public val UPDATE_INTERVAL_KEY: Name = Name.parse("update.interval") } @@ -286,7 +278,11 @@ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() - /** * Attach VisionForge server application to given server */ -public fun Application.visionServer(context: Context, route: String = DEFAULT_PAGE): VisionServer { +public fun Application.visionServer( + visionManager: VisionManager, + webServerUrl: Url, + path: String = DEFAULT_PAGE, +): VisionServer { if (featureOrNull(WebSockets) == null) { install(WebSockets) } @@ -301,17 +297,15 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA install(CallLogging) } - val visionManager = context.fetch(VisionManager) + val serverRoute = (featureOrNull(Routing) ?: install(Routing)).createRouteFromPath(path) - routing { - route(route) { - static { - resources() - } + serverRoute { + static { + resources() } } - return VisionServer(visionManager, this, route) + return VisionServer(visionManager, webServerUrl.copy(encodedPath = path), serverRoute) } /** @@ -319,10 +313,11 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA */ public fun VisionManager.serve( host: String = "localhost", - port: Int = 7777, + port: Int = VisionServer.DEFAULT_PORT, block: VisionServer.() -> Unit, ): ApplicationEngine = context.embeddedServer(CIO, port, host) { - visionServer(context).apply(block) + val url = URLBuilder(host = host, port = port).build() + visionServer(this@serve, url).apply(block) }.start() /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 8b1428ec..1d5fd3d9 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -47,7 +47,7 @@ public abstract class MeshThreeFactory( obj.onPropertyChange { name -> when { name.startsWith(Solid.GEOMETRY_KEY) -> { - val oldGeometry = mesh.geometry as BufferGeometry + val oldGeometry = mesh.geometry val newGeometry = buildGeometry(obj) oldGeometry.attributes = newGeometry.attributes //mesh.applyWireFrame(obj) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index d715a20f..ef9944e0 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -53,7 +53,7 @@ public class ThreeCanvas( private val mousePosition: Vector2 = Vector2() private val scene: Scene = Scene().apply { - options.useProperty(Canvas3DOptions::axes, this) { axesConfig -> + options.useProperty(Canvas3DOptions::axes, this) { getObjectByName(AXES_NAME)?.let { remove(it) } val axesObject = AxesHelper(axes.size.toInt()).apply { visible = axes.visible } axesObject.name = AXES_NAME diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt index 94034547..d6656c46 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.three.server -import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.html.page @@ -16,7 +16,7 @@ public fun VisionServer.useThreeJs(): Unit { } @DFExperimental -public fun Context.makeThreeJsFile( +public fun VisionManager.makeThreeJsFile( content: HtmlVisionFragment, path: Path? = null, title: String = "VisionForge page", -- 2.34.1 From bf5d47fd0e934a82e6e21b9dc1b74819ad453f8d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 19:43:31 +0300 Subject: [PATCH 051/143] remove production build from intermediate libraries --- demo/playground/build.gradle.kts | 28 +++++++++++++-------------- visionforge-gdml/build.gradle.kts | 7 +++++-- visionforge-markdown/build.gradle.kts | 22 +-------------------- visionforge-plotly/build.gradle.kts | 15 +------------- visionforge-threejs/build.gradle.kts | 6 ++++++ 5 files changed, 26 insertions(+), 52 deletions(-) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 9a845c50..8bad3769 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -29,9 +29,10 @@ kotlin { jvm { withJava() compilations.all { - kotlinOptions{ + kotlinOptions { jvmTarget = "11" - freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + freeCompilerArgs = + freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" } } testRuns["test"].executionTask.configure { @@ -39,18 +40,6 @@ kotlin { } } - afterEvaluate { - val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - afterEvaluate { - from(jsBrowserDistribution) - } - } - } - - sourceSets { val commonMain by getting { dependencies { @@ -80,7 +69,16 @@ kotlin { } } -val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class){ +val jsBrowserDistribution = tasks.getByName("jsBrowserDistribution") + +tasks.getByName("jvmProcessResources") { + dependsOn(jsBrowserDistribution) + from(jsBrowserDistribution) { + exclude("**/*.js.map") + } +} + +val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class) { libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") } diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 7ad37466..98a474ec 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -3,10 +3,13 @@ plugins { } kotlin { + js{ + binaries.library() + } sourceSets { - val commonMain by getting { + commonMain{ dependencies { - api(project(":visionforge-solid")) + api(projects.visionforgeSolid) api("space.kscience:gdml:0.4.0") } } diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 210e4ee8..1a8e4efd 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -10,27 +10,7 @@ kscience { kotlin { js { - //binaries.library() - binaries.executable() - browser { - webpackTask { - outputFileName = "js/visionforge-markdown.js" - } - } - } - - jvm { - val processResourcesTaskName = - compilations[org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.MAIN_COMPILATION_NAME] - .processResourcesTaskName - } - - - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) + binaries.library() } sourceSets { diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index b0b5a9c2..caeb4e52 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -10,20 +10,7 @@ kscience { kotlin { js { - //binaries.library() - binaries.executable() - browser { - webpackTask { - this.outputFileName = "js/visionforge-three.js" - } - } - } - - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) + binaries.library() } sourceSets { diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 37b8772f..5ae86f41 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -2,6 +2,12 @@ plugins { id("ru.mipt.npm.gradle.js") } +kotlin{ + js{ + binaries.library() + } +} + dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.130.1")) -- 2.34.1 From 59e939a17573ed8dbc1f92f48c38994f474032e2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 22:02:55 +0300 Subject: [PATCH 052/143] Minor logging update --- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 23 +++++++---- ...erHandler.kt => VisionForgeForNotebook.kt} | 38 +++++++++++-------- visionforge-gdml/build.gradle.kts | 8 +--- 3 files changed, 40 insertions(+), 29 deletions(-) rename jupyter/jupyter-base/src/jvmMain/kotlin/{VisionForgeServerHandler.kt => VisionForgeForNotebook.kt} (78%) diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt index b0422516..4eb4c9f7 100644 --- a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.jupyter +import kotlinx.html.p import kotlinx.html.stream.createHTML +import kotlinx.html.style import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration @@ -8,22 +10,19 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.Vision -import space.kscience.visionforge.html.HtmlFormFragment -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.* @DFExperimental public abstract class JupyterPluginBase(final override val context: Context) : JupyterIntegration(), ContextAware { - protected val handler: VisionForgeServerHandler = VisionForgeServerHandler(context) + protected val handler: VisionForgeForNotebook = VisionForgeForNotebook(context) protected abstract fun Builder.afterLoaded() final override fun Builder.onLoaded() { onLoaded { - declare("visionForge" to handler) + declare("VisionForge" to handler, "vf" to handler) } onShutdown { @@ -35,6 +34,9 @@ public abstract class JupyterPluginBase(final override val context: Context) : J "space.kscience.visionforge.html.*" ) + render { fragment -> + handler.produceHtml(fragment = fragment) + } render { fragment -> handler.produceHtml(fragment = fragment) @@ -53,10 +55,17 @@ public abstract class JupyterPluginBase(final override val context: Context) : J render { fragment -> handler.produceHtml { + if (!handler.isServerRunning()) { + p { + style = "color: red;" + +"The server is not running. Forms are not interactive. Start server with `VisionForge.startServer()." + } + } fragment(fragment.formBody) vision(fragment.vision) } } + afterLoaded() } -} +} \ No newline at end of file diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt similarity index 78% rename from jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt rename to jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt index a01bdc43..8b17bc82 100644 --- a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.jupyter import io.ktor.server.engine.ApplicationEngine import kotlinx.html.FORM +import kotlinx.html.TagConsumer import kotlinx.html.p import kotlinx.html.stream.createHTML import kotlinx.html.style @@ -15,14 +16,16 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string import space.kscience.visionforge.html.HtmlFormFragment -import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.three.server.VisionServer import space.kscience.visionforge.three.server.serve import space.kscience.visionforge.visionManager -public class VisionForgeServerHandler(override val context: Context) : ContextAware { +/** + * A handler class that includes a server and common utilities + */ +public class VisionForgeForNotebook(override val context: Context) : ContextAware { private var counter = 0 private var engine: ApplicationEngine? = null @@ -34,27 +37,31 @@ public class VisionForgeServerHandler(override val context: Context) : ContextAw isolateFragments = true } + public fun isServerRunning(): Boolean = server != null + + public fun html(block: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(createHTML().apply(block).finalize()) + public fun startServer( host: String = context.properties["visionforge.host"].string ?: "localhost", port: Int = context.properties["visionforge.port"].int ?: VisionServer.DEFAULT_PORT, configuration: VisionServer.() -> Unit = {}, - ): HtmlFragment { + ): MimeTypedResult = html { + if (server != null) { + p { + style = "color: red;" + +"Stopping current VisionForge server" + } + } + engine?.stop(1000, 2000) engine = context.visionManager.serve(host, port) { configuration() server = this }.start() - return { - if(server!= null){ - p { - style = "color: red;" - +"Stopping current VisionForge server" - } - } - p { - style = "color: blue;" - +"Starting VisionForge server on http://$host:$port" - } + + p { + style = "color: blue;" + +"Starting VisionForge server on http://$host:$port" } } @@ -77,5 +84,6 @@ public class VisionForgeServerHandler(override val context: Context) : ContextAw public fun fragment(body: HtmlVisionFragment): MimeTypedResult = produceHtml(fragment = body) public fun page(body: HtmlVisionFragment): MimeTypedResult = produceHtml(true, body) - public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) + public fun form(builder: FORM.() -> Unit): HtmlFormFragment = + HtmlFormFragment("form[${counter++}]", builder = builder) } \ No newline at end of file diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 98a474ec..bfe711c8 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -14,10 +14,4 @@ kotlin { } } } -} - -//tasks{ -// val jsBrowserWebpack by getting(KotlinWebpack::class) { -// sourceMaps = false -// } -//} \ No newline at end of file +} \ No newline at end of file -- 2.34.1 From 6d5c00f88b4d3077c987c9ad3bd833a2fd98f1fe Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 12:29:43 +0300 Subject: [PATCH 053/143] Tables + demo --- README.md | 71 +- build.gradle.kts | 17 +- demo/gdml/build.gradle.kts | 2 + demo/playground/build.gradle.kts | 7 +- .../src/jsMain/kotlin/playgroundMain.kt | 2 + .../src/jsMain/resources/css/common.css | 40 - .../src/jsMain/resources/index.html | 16 - .../src/jvmMain/kotlin/allThingsDemo.kt | 181 ++ .../src/jvmMain/kotlin/markdownDemo.kt | 91 - .../src/jvmMain/kotlin/serverExtensions.kt | 7 +- demo/playground/src/jvmMain/kotlin/tables.kt | 28 + demo/playground/webpack.config.d/01.ring.js | 21 +- demo/playground/webpack.config.d/02.bundle.js | 10 + docs/templates/ARTIFACT-TEMPLATE.md | 26 + docs/templates/README-TEMPLATE.md | 138 + jupyter/{jupyter-base => }/build.gradle.kts | 0 .../src/jvmMain/kotlin/JupyterPluginBase.kt | 0 .../jvmMain/kotlin/VisionForgeForNotebook.kt | 0 .../visionforge-jupyter-gdml/build.gradle.kts | 2 +- settings.gradle.kts | 16 +- .../ThreeViewWithControls.kt | 6 +- visionforge-core/build.gradle.kts | 16 +- .../kscience/visionforge/VisionGroupBase.kt | 2 +- .../visionforge/html/VisionTagConsumer.kt | 6 + .../kscience/visionforge/VisionClient.kt | 16 +- visionforge-fx/build.gradle.kts | 4 + .../kscience/visionforge/plotly/plotlyJs.kt | 12 +- .../visionforge/plotly/plotlyHeaders.kt | 22 - .../kscience/visionforge/plotly/plotlyJvm.kt | 2 +- visionforge-solid/build.gradle.kts | 8 +- visionforge-tables/build.gradle.kts | 40 + .../visionforge/tables/TableVisionPlugin.kt | 30 + .../visionforge/tables/VisionOfTable.kt | 113 + .../visionforge/tables/VisionOfTableTest.kt | 32 + .../visionforge/tables/TableVisionJsPlugin.kt | 96 + .../src/jsMain/kotlin/tabulator/Tabulator.kt | 2347 +++++++++++++++++ .../jsMain/kotlin/tabulator/typealiases.kt | 45 + .../solid/three/ThreeLabelFactory.kt | 3 +- 38 files changed, 3208 insertions(+), 267 deletions(-) delete mode 100644 demo/playground/src/jsMain/resources/css/common.css delete mode 100644 demo/playground/src/jsMain/resources/index.html create mode 100644 demo/playground/src/jvmMain/kotlin/allThingsDemo.kt delete mode 100644 demo/playground/src/jvmMain/kotlin/markdownDemo.kt create mode 100644 demo/playground/src/jvmMain/kotlin/tables.kt create mode 100644 demo/playground/webpack.config.d/02.bundle.js create mode 100644 docs/templates/ARTIFACT-TEMPLATE.md create mode 100644 docs/templates/README-TEMPLATE.md rename jupyter/{jupyter-base => }/build.gradle.kts (100%) rename jupyter/{jupyter-base => }/src/jvmMain/kotlin/JupyterPluginBase.kt (100%) rename jupyter/{jupyter-base => }/src/jvmMain/kotlin/VisionForgeForNotebook.kt (100%) delete mode 100644 visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt create mode 100644 visionforge-tables/build.gradle.kts create mode 100644 visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt create mode 100644 visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt create mode 100644 visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt diff --git a/README.md b/README.md index 032b7ee4..6a77447e 100644 --- a/README.md +++ b/README.md @@ -14,30 +14,22 @@ * [Features](#features) * [About DataForge](#about-dataforge) * [Modules contained in this repository](#modules-contained-in-this-repository) - * [visionforge-core](#visionforge-core) - * [visionforge-fx](#visionforge-fx) - * [visionforge-gdml](#visionforge-gdml) - * [visionforge-markdown](#visionforge-markdown) - * [visionforge-plotly](#visionforge-plotly) - * [visionforge-server](#visionforge-server) - * [visionforge-solid](#visionforge-solid) - * [visionforge-threejs](#visionforge-threejs) -* [Visualization for External Systems](#visualization-for-external-systems) +* [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Solid Showcase](#simple-example---solid-showcase) - * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) - * [GDML Example](#gdml-example) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) ## Introduction -This repository contains a [DataForge](#about-dataforge)\-based framework -used for visualization in various scientific applications. +This repository contains a [DataForge](#about-dataforge)\-based framework +used for visualization in various scientific applications. -The main framework's use case for now is 3D visualization for particle physics experiments. +The main framework's use case for now is 3D visualization for particle physics experiments. Other applications including 2D plots are planned for the future. -The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) application, currently targeting browser JavaScript and JVM. ## Requirements @@ -62,39 +54,14 @@ Platform uses some of the concepts and modules of DataForge, including: `Meta`, `Provider`, and some others. To learn more about DataForge, please consult the following URLs: - * [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) - * [DataForge documentation](http://npm.mipt.ru/dataforge/) - * [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) +* [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) +* [DataForge documentation](http://npm.mipt.ru/dataforge/) +* [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) ## Modules contained in this repository -### visionforge-core - -Contains a general hierarchy of classes and interfaces useful for visualization. -This module is not specific to 3D-visualization. - -The `visionforge-core` module also includes configuration editors for JS (in `jsMain`) and JVM (in `jvmMain`). - -**Class diagram:** - -![](docs/images/class-diag-core.png) - -### visionforge-fx - -### visionforge-gdml - -GDML bindings for 3D visualization (to be moved to gdml project). - -### visionforge-markdown - -### visionforge-plotly - -### visionforge-server - -### visionforge-solid - -Includes common classes and serializers for 3D visualization, as well as Three.js and JavaFX implementations. +$modules **Class diagram:** @@ -103,26 +70,26 @@ Includes common classes and serializers for 3D visualization, as well as Three.j ##### Prototypes One of the important features of the framework is support for 3D object prototypes (sometimes -also referred to as templates). The idea is that prototype geometry can be rendered once and reused +also referred to as templates). The idea is that prototype geometry can be rendered once and reused for multiple objects. This helps to significantly decrease memory usage. -The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and `SolidReference` class helps to reuse a template object. ##### Styles -`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. ### visionforge-threejs -## Visualization for External Systems +## Visualization for External Systems The `visionforge` framework can be used to visualize geometry and events from external, non-Kotlin based systems, such as ROOT. This will require a plugin to convert data model of the external system to that of `visionforge`. Performing such integration is a work currently in progress. - + ## Demonstrations @@ -144,7 +111,7 @@ Some shapes will also periodically change their color and visibility. ### Full-Stack Application Example - Muon Monitor Visualization -A full-stack application example, showing the +A full-stack application example, showing the [Muon Monitor](http://npm.mipt.ru/en/projects/physics#mounMonitor) experiment set-up. [More details](demo/muon-monitor/README.md) @@ -156,7 +123,7 @@ A full-stack application example, showing the ### GDML Example -Visualization example for geometry defined as GDML file. +Visualization example for geometry defined as GDML file. [More details](demo/gdml/README.md) diff --git a/build.gradle.kts b/build.gradle.kts index 625efc2c..a81d1656 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,26 +1,23 @@ plugins { id("ru.mipt.npm.gradle.project") + id("org.jetbrains.kotlinx.kover") version "0.5.0-RC" } val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") -allprojects { +subprojects { + if (name.startsWith("visionforge")) apply() + repositories { - mavenLocal() - mavenCentral() maven("https://repo.kotlin.link") + mavenCentral() maven("https://maven.jzy3d.org/releases") } group = "space.kscience" - version = "0.2.0" -} + version = "0.2.0-dev-99" -subprojects { - if (name.startsWith("visionforge")) { - plugins.apply("maven-publish") - } } ksciencePublish { @@ -30,10 +27,10 @@ ksciencePublish { } apiValidation { - validationDisabled = true ignoredPackages.add("info.laht.threekt") } +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") //workaround for https://youtrack.jetbrains.com/issue/KT-48273 rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index ead65970..a6c3fb0a 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -16,6 +16,7 @@ kotlin { jvm { withJava() } + js { useCommonJs() browser { @@ -24,6 +25,7 @@ kotlin { } } } + sourceSets { commonMain { dependencies { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 8bad3769..61f4e033 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -47,8 +47,9 @@ kotlin { implementation(projects.visionforgeGdml) implementation(projects.visionforgePlotly) implementation(projects.visionforgeMarkdown) + implementation(projects.visionforgeTables) implementation(projects.cernRootLoader) - implementation(projects.jupyter.jupyterBase) + implementation(projects.jupyter) } } @@ -56,6 +57,7 @@ kotlin { dependencies { implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) + compileOnly(npm("webpack-bundle-analyzer","4.5.0")) } } @@ -66,6 +68,9 @@ kotlin { implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } + all { + languageSettings.optIn("space.kscience.dataforge.misc.DFExperimental") + } } } diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 0ea9abe5..3ad34867 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -3,10 +3,12 @@ import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.tables.TableVisionJsPlugin @DFExperimental fun main() = runVisionClient { plugin(ThreeWithControlsPlugin) plugin(PlotlyPlugin) plugin(MarkupPlugin) + plugin(TableVisionJsPlugin) } \ No newline at end of file diff --git a/demo/playground/src/jsMain/resources/css/common.css b/demo/playground/src/jsMain/resources/css/common.css deleted file mode 100644 index 316c4f0e..00000000 --- a/demo/playground/src/jsMain/resources/css/common.css +++ /dev/null @@ -1,40 +0,0 @@ -/* Remove default bullets */ -ul, .tree { - list-style-type: none; -} - -/* Style the caret/arrow */ -.tree-caret { - cursor: pointer; - user-select: none; /* Prevent text selection */ -} - -/* Create the caret/arrow with a unicode, and style it */ -.tree-caret::before { - content: "\25B6"; - color: black; - display: inline-block; - margin-right: 6px; -} - -/* Rotate the caret/arrow icon when clicked on (using JavaScript) */ -.tree-caret-down::before { - transform: rotate(90deg); -} - -ul, .tree { - list-style-type: none; -} - -i, .tree-caret{ - display: inline-block; - margin-right: 6px; -} - -.rotate { - transform: rotate(90deg); -} - -.tree-label-inactive { - color: gray; -} diff --git a/demo/playground/src/jsMain/resources/index.html b/demo/playground/src/jsMain/resources/index.html deleted file mode 100644 index 1917c33d..00000000 --- a/demo/playground/src/jsMain/resources/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Playground - - - - - -
-

Playground

-
-
- - \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt new file mode 100644 index 00000000..0ff49d40 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -0,0 +1,181 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.h1 +import kotlinx.html.h2 +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.values.ValueType +import space.kscience.plotly.layout +import space.kscience.plotly.models.ScatterMode +import space.kscience.plotly.models.TextPosition +import space.kscience.plotly.scatter +import space.kscience.tables.ColumnHeader +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.markup.markdown +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.plotly.plotly +import space.kscience.visionforge.solid.* +import space.kscience.visionforge.tables.TableVisionPlugin +import space.kscience.visionforge.tables.columnTable +import java.nio.file.Paths + +fun main() { + val context = Context { + plugin(Solids) + plugin(PlotlyPlugin) + plugin(TableVisionPlugin) + } + + context.makeVisionFile( + Paths.get("VisionForgeDemo.html"), + resourceLocation = ResourceLocation.EMBED + ) { + markdown { + //language=markdown + """ + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + """.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") + } + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } + } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" + } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") + } + } + } + } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + markdown { + //language=markdown + """ + ## The code for everything above + ```kotlin + markdown { + //language=markdown + ""${'"'} + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + ""${'"'}.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") + } + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } + } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" + } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") + } + } + } + } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + ``` + """.trimIndent() + } + } +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/markdownDemo.kt b/demo/playground/src/jvmMain/kotlin/markdownDemo.kt deleted file mode 100644 index cb4b7cf0..00000000 --- a/demo/playground/src/jvmMain/kotlin/markdownDemo.kt +++ /dev/null @@ -1,91 +0,0 @@ -package space.kscience.visionforge.examples - -import kotlinx.html.div -import kotlinx.html.h1 -import space.kscience.dataforge.context.Context -import space.kscience.plotly.layout -import space.kscience.plotly.models.ScatterMode -import space.kscience.plotly.models.TextPosition -import space.kscience.plotly.scatter -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.markup.markdown -import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.* - -fun main() { - val context = Context { - plugin(Solids) - plugin(PlotlyPlugin) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { - markdown { - //language=markdown - """ - # Section - - **TBD** - - ## Subsection - """.trimIndent() - } - - div { - h1 { +"Canvas" } - vision("canvas") { - solid { - box(100, 100, 100) - material { - emissiveColor("red") - } - } - } - } - - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } - } - - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } - } - - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } - } - } - } - } - } -} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 6d9ff46c..b8bb633a 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -24,10 +24,13 @@ public fun Context.makeVisionFile( title: String = "VisionForge page", resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, show: Boolean = true, - content: VisionTagConsumer<*>.() -> Unit + content: VisionTagConsumer<*>.() -> Unit, ): Unit { val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> - mapOf("playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) + mapOf( + "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + //"tables" to tabulatorCssHader + ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } diff --git a/demo/playground/src/jvmMain/kotlin/tables.kt b/demo/playground/src/jvmMain/kotlin/tables.kt new file mode 100644 index 00000000..c386ffda --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/tables.kt @@ -0,0 +1,28 @@ +package space.kscience.visionforge.examples + +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.values.ValueType +import space.kscience.tables.ColumnHeader +import space.kscience.tables.valueRow +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.tables.TableVisionPlugin +import space.kscience.visionforge.tables.table +import kotlin.math.pow + +fun main() { + val context = Context { + plugin(TableVisionPlugin) + } + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + + context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision { + table(x, y) { + repeat(100) { + valueRow(x to it, y to it.toDouble().pow(2)) + } + } + } + } +} \ No newline at end of file diff --git a/demo/playground/webpack.config.d/01.ring.js b/demo/playground/webpack.config.d/01.ring.js index 41da041c..fbde1b41 100644 --- a/demo/playground/webpack.config.d/01.ring.js +++ b/demo/playground/webpack.config.d/01.ring.js @@ -1,3 +1,22 @@ const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file +config.module.rules.push(...ringConfig.module.rules) + +config.module.rules.push( + { + test: /\.css$/, + exclude: [ + 'D:\\Work\\Projects\\visionforge\\build\\js\\node_modules\\@jetbrains\\ring-ui' + ], + use: [ + { + loader: 'style-loader', + options: {} + }, + { + loader: 'css-loader', + options: {} + } + ] + } +) \ No newline at end of file diff --git a/demo/playground/webpack.config.d/02.bundle.js b/demo/playground/webpack.config.d/02.bundle.js new file mode 100644 index 00000000..947253ca --- /dev/null +++ b/demo/playground/webpack.config.d/02.bundle.js @@ -0,0 +1,10 @@ +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + +module.exports = { + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: "static", + reportFilename: "bundle-report.html" + }) + ] +} \ No newline at end of file diff --git a/docs/templates/ARTIFACT-TEMPLATE.md b/docs/templates/ARTIFACT-TEMPLATE.md new file mode 100644 index 00000000..91e09096 --- /dev/null +++ b/docs/templates/ARTIFACT-TEMPLATE.md @@ -0,0 +1,26 @@ +## Artifact: + +The Maven coordinates of this project are `${group}:${name}:${version}`. + +**Gradle Groovy:** +```gradle +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation '${group}:${name}:${version}' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("${group}:${name}:${version}") +} +``` \ No newline at end of file diff --git a/docs/templates/README-TEMPLATE.md b/docs/templates/README-TEMPLATE.md new file mode 100644 index 00000000..775c2b12 --- /dev/null +++ b/docs/templates/README-TEMPLATE.md @@ -0,0 +1,138 @@ +[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) +[![DOI](https://zenodo.org/badge/174502624.svg)](https://zenodo.org/badge/latestdoi/174502624) + +![Gradle build](https://github.com/mipt-npm/visionforge/workflows/Gradle%20build/badge.svg) + +[![Slack](https://img.shields.io/badge/slack-channel-green?logo=slack)](https://kotlinlang.slack.com/archives/CEXV2QWNM) + +# DataForge Visualization Platform + +## Table of Contents + +* [Introduction](#introduction) +* [Requirements](#requirements) +* [Features](#features) +* [About DataForge](#about-dataforge) +* [Modules contained in this repository](#modules-contained-in-this-repository) +* [Visualization for External Systems](#visualization-for-external-systems) +* [Demonstrations](#demonstrations) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) + + +## Introduction + +This repository contains a [DataForge](#about-dataforge)\-based framework +used for visualization in various scientific applications. + +The main framework's use case for now is 3D visualization for particle physics experiments. +Other applications including 2D plots are planned for the future. + +The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +application, currently targeting browser JavaScript and JVM. + +## Requirements + +JVM backend requires JDK 11 or later + +## Features + +The main framework's features for now include: +- 3D visualization of complex experimental set-ups +- Event display such as particle tracks, etc. +- Scales up to few hundred thousands of elements +- Camera move, rotate, zoom-in and zoom-out +- Scene graph as an object tree with property editor +- Settings export and import +- Multiple platform support + +## About DataForge + +DataForge is a software framework for automated scientific data processing. DataForge Visualization +Platform uses some of the concepts and modules of DataForge, including: `Meta`, `Configuration`, `Context`, +`Provider`, and some others. + +To learn more about DataForge, please consult the following URLs: +* [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) +* [DataForge documentation](http://npm.mipt.ru/dataforge/) +* [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) + + +## Modules contained in this repository + +$modules + +**Class diagram:** + +![](docs/images/class-diag-solid.png) + +##### Prototypes + +One of the important features of the framework is support for 3D object prototypes (sometimes +also referred to as templates). The idea is that prototype geometry can be rendered once and reused +for multiple objects. This helps to significantly decrease memory usage. + +The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +`SolidReference` class helps to reuse a template object. + +##### Styles + +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's +level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. + +### visionforge-threejs + +## Visualization for External Systems + +The `visionforge` framework can be used to visualize geometry and events from external, +non-Kotlin based systems, such as ROOT. This will require a plugin to convert data model +of the external system to that of `visionforge`. Performing such integration is a work +currently in progress. + + +## Demonstrations + +The `demo` module contains several example projects (demonstrations) of using the `visionforge` framework. +They are briefly described in this section, for more details please consult the corresponding per-project +README file. + +### Simple Example - Solid Showcase + +Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. +Some shapes will also periodically change their color and visibility. + +[More details](demo/solid-showcase/README.md) + +**Example view:** + +![](docs/images/solid-showcase.png) + + +### Full-Stack Application Example - Muon Monitor Visualization + +A full-stack application example, showing the +[Muon Monitor](http://npm.mipt.ru/en/projects/physics#mounMonitor) experiment set-up. + +[More details](demo/muon-monitor/README.md) + +**Example view:** + +![](docs/images/muon-monitor.png) + + +### GDML Example + +Visualization example for geometry defined as GDML file. + +[More details](demo/gdml/README.md) + +##### Example view: + +![](docs/images/gdml-demo.png) + + +## Thanks and references +The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. + +All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. diff --git a/jupyter/jupyter-base/build.gradle.kts b/jupyter/build.gradle.kts similarity index 100% rename from jupyter/jupyter-base/build.gradle.kts rename to jupyter/build.gradle.kts diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt similarity index 100% rename from jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename to jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt similarity index 100% rename from jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt rename to jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index afb08473..4a575602 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -33,7 +33,7 @@ kotlin { commonMain { dependencies { implementation(projects.visionforgeSolid) - implementation(projects.jupyter.jupyterBase) + implementation(projects.jupyter) } } jvmMain { diff --git a/settings.gradle.kts b/settings.gradle.kts index 6d3e5961..3ae9f6f9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,9 +1,14 @@ +rootProject.name = "visionforge" + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +enableFeaturePreview("VERSION_CATALOGS") + pluginManagement { val toolsVersion: String by extra repositories { - //mavenLocal() + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() @@ -17,16 +22,12 @@ pluginManagement { } } -rootProject.name = "visionforge" - -enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -enableFeaturePreview("VERSION_CATALOGS") - dependencyResolutionManagement { val toolsVersion: String by extra repositories { + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() } @@ -53,6 +54,7 @@ include( ":cern-root-loader", ":visionforge-server", ":visionforge-plotly", + ":visionforge-tables", ":visionforge-markdown", ":demo:solid-showcase", ":demo:gdml", @@ -61,6 +63,6 @@ include( ":demo:playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:jupyter-base", + ":jupyter", ":jupyter:visionforge-jupyter-gdml" ) diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 97c9a083..5cdcf5c0 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -82,8 +82,10 @@ public val ThreeCanvasWithControls: FC = fc("Three useEffect { props.context.launch { - solid = props.builderOfSolid.await().also { - it?.setAsRoot(props.context.visionManager) + solid = props.builderOfSolid.await() + //ensure that the solid is properly rooted + if(solid?.parent == null){ + solid?.setAsRoot(props.context.visionManager) } } } diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index ecd14331..227c80dc 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -4,12 +4,6 @@ plugins { val dataforgeVersion: String by rootProject.extra -kscience{ - useSerialization{ - json() - } -} - kotlin { sourceSets { commonMain { @@ -25,4 +19,14 @@ kotlin { } } } +} + +kscience{ + useSerialization{ + json() + } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index 873b5996..7c2af29e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -163,6 +163,6 @@ internal class RootVisionGroup(override val manager: VisionManager) : VisionGrou * Designate this [VisionGroup] as a root and assign a [VisionManager] as its parent */ public fun Vision.setAsRoot(manager: VisionManager) { - if (parent != null) error("This Vision already has a parent. It could not be set as root") + if (parent != null) error("Vision $this already has a parent. It could not be set as root") parent = RootVisionGroup(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index c9bd6857..7a17f0f5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -78,6 +78,10 @@ public abstract class VisionTagConsumer( } } + /** + * Insert a vision in this HTML. + * TODO replace by multi-receiver + */ @OptIn(DFExperimental::class) public inline fun TagConsumer.vision( name: Name, @@ -122,6 +126,8 @@ public abstract class VisionTagConsumer( public const val OUTPUT_FETCH_ATTRIBUTE: String = "data-output-fetch" public const val OUTPUT_CONNECT_ATTRIBUTE: String = "data-output-connect" + public const val OUTPUT_RENDERED: String = "data-output-rendered" + public const val OUTPUT_NAME_ATTRIBUTE: String = "data-output-name" public const val OUTPUT_ENDPOINT_ATTRIBUTE: String = "data-output-endpoint" public const val DEFAULT_ENDPOINT: String = "." diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 2bd6dc84..c437a5d6 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -19,6 +19,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNEC import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOINT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE +import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_RENDERED import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds @@ -64,7 +65,8 @@ public class VisionClient : AbstractPlugin() { private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { - val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") + val renderer = findRendererFor(vision) + ?: error("Could not find renderer for ${visionManager.encodeToString(vision)}") renderer.render(element, vision, outputMeta) element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> @@ -138,10 +140,15 @@ public class VisionClient : AbstractPlugin() { * Fetch from server and render a vision, described in a given with [VisionTagConsumer.OUTPUT_CLASS] class. */ public fun renderVisionIn(element: Element) { - val name = resolveName(element) ?: error("The element is not a vision output") - logger.info { "Found DF output with name $name" } if (!element.classList.contains(VisionTagConsumer.OUTPUT_CLASS)) error("The element $element is not an output element") + val name = resolveName(element) ?: error("The element is not a vision output") + if (element.attributes[OUTPUT_RENDERED]?.value == "true") { + logger.info { "VF output in element $element is already rendered" } + return + } else { + logger.info { "Rendering VF output with name $name" } + } val outputMeta = element.getEmbeddedData(VisionTagConsumer.OUTPUT_META_CLASS)?.let { VisionManager.defaultJson.decodeFromString(MetaSerializer, it) @@ -186,6 +193,7 @@ public class VisionClient : AbstractPlugin() { } else -> error("No embedded vision data / fetch url for $name") } + element.setAttribute(OUTPUT_RENDERED, "true") } override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) mapOf( @@ -254,5 +262,5 @@ public fun runVisionClient(contextBuilder: ContextBuilder.() -> Unit) { val visionClient = context.fetch(VisionClient) window.asDynamic()[RENDER_FUNCTION_NAME] = visionClient::renderAllVisionsById - visionClient.renderAllVisions() + //visionClient.renderAllVisions() } \ No newline at end of file diff --git a/visionforge-fx/build.gradle.kts b/visionforge-fx/build.gradle.kts index 7b522fc4..26fa13c8 100644 --- a/visionforge-fx/build.gradle.kts +++ b/visionforge-fx/build.gradle.kts @@ -19,4 +19,8 @@ dependencies { implementation("eu.mihosoft.vrl.jcsg:jcsg:0.5.7") { exclude(module = "slf4j-simple") } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index e0cea767..7406986b 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -31,20 +31,16 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) -// println(plot.meta) -// println(plot.data[0].toMeta()) element.plot(plot, config) } - override fun content(target: String): Map { - return when (target) { - ElementVisionRenderer.TYPE -> mapOf("plotly".asName() to this) - else -> super.content(target) - } + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("plotly".asName() to this) + else -> super.content(target) } public actual companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag("vision.plotly.js", PluginTag.DATAFORGE_GROUP) override val type: KClass = PlotlyPlugin::class override fun invoke(meta: Meta, context: Context): PlotlyPlugin = PlotlyPlugin() } diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt deleted file mode 100644 index 8c986125..00000000 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt +++ /dev/null @@ -1,22 +0,0 @@ -package space.kscience.visionforge.plotly - -//internal val plotlyScriptLocation = "js/visionforge-three.js" -// -///** -// * A header that stores/embeds plotly bundle and registers plotly renderer in the frontend -// */ -//@OptIn(DFExperimental::class) -//public fun plotlyHeader(location: ResourceLocation, filePath: Path? = null): HtmlFragment = { -// scriptHeader( -// plotlyScriptLocation, -// resourceLocation = location, -// htmlPath = filePath -// ).invoke(this) -// script { -// type = "text/javascript" -// unsafe { -// //language=JavaScript -// +"space.kscience.visionforge.plotly.loadPlotly()" -// } -// } -//} diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt index 21522664..ad7be4f3 100644 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt +++ b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt @@ -9,7 +9,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.VisionPlugin import kotlin.reflect.KClass -public actual class PlotlyPlugin : VisionPlugin(), Plugin { +public actual class PlotlyPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index 8b0b1dc2..e00830d5 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -3,7 +3,9 @@ plugins { } kscience{ - useSerialization() + useSerialization{ + json() + } } kotlin { @@ -14,4 +16,8 @@ kotlin { } } } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts new file mode 100644 index 00000000..55c367c5 --- /dev/null +++ b/visionforge-tables/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") +} + +val tablesVersion = "0.1.4" + +kscience { + useSerialization() +} + +kotlin { + js { + useCommonJs() + binaries.library() + browser{ + commonWebpackConfig{ + cssSupport.enabled = true + } + } + } + + sourceSets { + commonMain { + dependencies { + api(project(":visionforge-core")) + api("space.kscience:tables-kt:${tablesVersion}") + } + } + jsMain { + dependencies { + implementation(npm("tabulator-tables", "5.0.1")) + implementation(npm("@types/tabulator-tables", "5.0.1")) + } + } + } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE +} \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt new file mode 100644 index 00000000..6e632147 --- /dev/null +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt @@ -0,0 +1,30 @@ +package space.kscience.visionforge.tables + +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.VisionPlugin +import kotlin.reflect.KClass + +public class TableVisionPlugin : VisionPlugin() { + override val tag: PluginTag get() = Companion.tag + + override val visionSerializersModule: SerializersModule + get() = SerializersModule { + polymorphic(Vision::class) { + subclass(VisionOfTable.serializer()) + } + } + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.table", PluginTag.DATAFORGE_GROUP) + override val type: KClass = TableVisionPlugin::class + override fun invoke(meta: Meta, context: Context): TableVisionPlugin = TableVisionPlugin() + } +} \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt new file mode 100644 index 00000000..a3147236 --- /dev/null +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -0,0 +1,113 @@ +package space.kscience.visionforge.tables + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.values.Null +import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue +import space.kscience.tables.* +import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.html.VisionOutput +import kotlin.jvm.JvmName +import kotlin.reflect.typeOf + +internal object ColumnHeaderSerializer : KSerializer> { + + override val descriptor: SerialDescriptor get() = MetaSerializer.descriptor + + override fun deserialize(decoder: Decoder): ColumnHeader { + val meta = decoder.decodeSerializableValue(MetaSerializer) + return SimpleColumnHeader(meta["name"].string!!, typeOf(), meta["meta"] ?: Meta.EMPTY) + } + + override fun serialize(encoder: Encoder, value: ColumnHeader) { + val meta = Meta { + "name" put value.name + "meta" put value.meta + } + encoder.encodeSerializableValue(MetaSerializer, meta) + } +} + +public val ColumnHeader.properties: ValueColumnScheme get() = ValueColumnScheme.read(meta) + +@Serializable +@SerialName("vision.table") +public class VisionOfTable( + override val headers: List<@Serializable(ColumnHeaderSerializer::class) ColumnHeader>, +) : VisionBase(), Rows { + + public var data: List + get() = meta.getIndexed("rows").entries.sortedBy { it.key?.toInt() }.map { it.value } + set(value) { + meta["rows"] = value + } + + public val rows: List get() = data.map(::MetaRow) + + override fun rowSequence(): Sequence> = rows.asSequence() +} + +/** + * Convert a table to a serializable vision + */ +@Suppress("UNCHECKED_CAST") +public fun Table.toVision( + converter: (T?) -> Value, +): VisionOfTable = VisionOfTable(headers as TableHeader).also { vision -> + vision.data = rows.map { row -> + if (row is MetaRow) { + row.meta + } else { + Meta { + headers.forEach { + it.name put converter(row[it.name]) + } + } + } + } +} + +@JvmName("valueTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { it ?: Null } + +@JvmName("stringTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { (it ?: "").asValue() } + +@JvmName("numberTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.NaN).asValue() } + +@DFExperimental +public inline fun VisionOutput.table( + vararg headers: ColumnHeader, + block: MutableRowTable.() -> Unit, +): VisionOfTable = RowTable(*headers, block = block).toVision() + +@DFExperimental +public inline fun VisionOutput.columnTable( + columnSize: UInt, + block: MutableColumnTable.() -> Unit, +): VisionOfTable = ColumnTable(columnSize, block).toVision() + +@DFExperimental +public fun VisionOutput.columnTable( + vararg dataAndHeaders: Pair, List>, +): VisionOfTable { + val columns = dataAndHeaders.map { (header, data) -> + ListColumn(header, data.map { Value.of(it) }) + } + return ColumnTable(columns).toVision() +} + +//public val tabulatorCssHader: HtmlFragment = { +// link { +// href = "https://unpkg.com/tabulator-tables@5.0.10/dist/css/tabulator.min.css" +// rel = "stylesheet" +// } +//} \ No newline at end of file diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt new file mode 100644 index 00000000..5796d8e2 --- /dev/null +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -0,0 +1,32 @@ +package space.kscience.visionforge.tables + +import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.double +import space.kscience.dataforge.values.int +import space.kscience.tables.ColumnHeader +import space.kscience.tables.ColumnTable +import space.kscience.tables.get +import kotlin.math.pow +import kotlin.test.Test +import kotlin.test.assertEquals + +internal class VisionOfTableTest { + @Test + fun tableSerialization() { + val x by ColumnHeader.typed() + val y by ColumnHeader.typed() + + val table = ColumnTable(100U) { + x.fill { it.asValue() } + y.values = x.values.map { it?.double?.pow(2)?.asValue() } + } + + val vision = table.toVision() + //println(Json.encodeToString(VisionOfTable.serializer(), table.toVision())) + + val rows = vision.rowSequence().toList() + + assertEquals(50, rows[50][x]?.int) + } +} \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt new file mode 100644 index 00000000..42525847 --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -0,0 +1,96 @@ +package space.kscience.visionforge.tables + +import kotlinext.js.jso +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import space.kscience.dataforge.context.AbstractPlugin +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.DynamicMeta +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.toDynamic +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient +import tabulator.Tabulator +import tabulator.TabulatorFull +import kotlin.reflect.KClass + +public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { + public val visionClient: VisionClient by require(VisionClient) + public val tablesBase: TableVisionPlugin by require(TableVisionPlugin) + + override val tag: PluginTag get() = Companion.tag + + override fun attach(context: Context) { + super.attach(context) + kotlinext.js.require("tabulator-tables/dist/css/tabulator.min.css") + kotlinext.js.require("tabulator-tables/src/js/modules/ResizeColumns/ResizeColumns.js") + } + + override fun rateVision(vision: Vision): Int = when (vision) { + is VisionOfTable -> ElementVisionRenderer.DEFAULT_RATING + else -> ElementVisionRenderer.ZERO_RATING + } + + override fun render(element: Element, vision: Vision, meta: Meta) { + val table: VisionOfTable = (vision as? VisionOfTable) + ?: error("VisionOfTable expected but ${vision::class} found") + + val tableOptions = jso { + columns = table.headers.map { header -> + jso { + field = header.name + title = header.properties.title ?: header.name + resizable = true + } + }.toTypedArray() + + columns = Array(table.headers.size + 1){ + if(it==0){ + jso { + field = "@index" + title = "#" + resizable = false + } + } else { + val header = table.headers[it-1] + jso { + field = header.name + title = header.properties.title ?: header.name + resizable = true + } + } + } + + + data = table.rows.mapIndexed { index, row-> + val d = row.meta.toDynamic() + d["@index"] = index + d + }.toTypedArray() + + //layout = "fitColumns" + + pagination = true + paginationSize = 10 + paginationSizeSelector = arrayOf(10, 25, 50, 100) + } + + TabulatorFull(element as HTMLElement, tableOptions) + } + + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("table".asName() to this) + else -> super.content(target) + } + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.table.js", PluginTag.DATAFORGE_GROUP) + override val type: KClass = TableVisionJsPlugin::class + override fun invoke(meta: Meta, context: Context): TableVisionJsPlugin = TableVisionJsPlugin() + } +} \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt new file mode 100644 index 00000000..f6efd32a --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt @@ -0,0 +1,2347 @@ +@file:Suppress("INTERFACE_WITH_SUPERCLASS", + "OVERRIDING_FINAL_MEMBER", + "RETURN_TYPE_MISMATCH_ON_OVERRIDE", + "CONFLICTING_OVERLOADS", + "NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING") + +@file:JsModule("tabulator-tables") + +package tabulator + +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import org.w3c.dom.events.MouseEvent +import org.w3c.dom.events.UIEvent +import tabulator.Tabulator.* +import kotlin.js.Promise + +external interface EventCallBackMethods { + var validationFailed: (cell: CellComponent, value: Any, validators: Array) -> Unit + var scrollHorizontal: (left: Number) -> Unit + var scrollVertical: (top: Number) -> Unit + var rowAdded: (row: RowComponent) -> Unit + var rowDeleted: (row: RowComponent) -> Unit + var rowMoved: (row: RowComponent) -> Unit + var rowUpdated: (row: RowComponent) -> Unit + var rowSelectionChanged: () -> Unit + var rowSelected: (row: RowComponent) -> Unit + var rowDeselected: (row: RowComponent) -> Unit + var rowResized: (row: RowComponent) -> Unit + var rowClick: (event: UIEvent, row: RowComponent) -> Unit + var rowDblClick: (event: UIEvent, row: RowComponent) -> Unit + var rowContext: (event: UIEvent, row: RowComponent) -> Unit + var rowTap: (event: UIEvent, row: RowComponent) -> Unit + var rowDblTap: (event: UIEvent, row: RowComponent) -> Unit + var rowTapHold: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseEnter: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseLeave: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseOver: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseOut: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseMove: (event: UIEvent, row: RowComponent) -> Unit + var htmlImporting: () -> Unit + var htmlImported: () -> Unit + var ajaxError: () -> Unit + var clipboardCopied: (clipboard: String) -> Unit + var clipboardPasted: (clipboard: String, rowData: Array, rows: Array) -> Unit + var clipboardPasteError: (clipboard: String) -> Unit + var downloadComplete: () -> Unit + var dataTreeRowExpanded: (row: RowComponent, level: Number) -> Unit + var dataTreeRowCollapsed: (row: RowComponent, level: Number) -> Unit + var pageLoaded: (pageNo: Number) -> Unit + var headerClick: (event: UIEvent, column: ColumnComponent) -> Unit + var headerDblClick: (event: UIEvent, column: ColumnComponent) -> Unit + var headerContext: (event: UIEvent, column: ColumnComponent) -> Unit + var headerTap: (event: UIEvent, column: ColumnComponent) -> Unit + var headerDblTap: (event: UIEvent, column: ColumnComponent) -> Unit + var headerTapHold: (event: UIEvent, column: ColumnComponent) -> Unit + var groupClick: (event: UIEvent, group: GroupComponent) -> Unit + var groupDblClick: (event: UIEvent, group: GroupComponent) -> Unit + var groupContext: (event: UIEvent, group: GroupComponent) -> Unit + var groupTap: (event: UIEvent, group: GroupComponent) -> Unit + var groupDblTap: (event: UIEvent, group: GroupComponent) -> Unit + var groupTapHold: (event: UIEvent, group: GroupComponent) -> Unit + var tableBuilding: () -> Unit + var tableBuilt: () -> Unit + var dataLoading: (data: Array) -> Unit + var dataLoaded: (data: Array) -> Unit + var dataChanged: (data: Array) -> Unit + var dataFiltering: (filters: Array) -> Unit + var dataFiltered: (filters: Array, rows: Array) -> Unit + var dataSorting: (sorters: Sorter) -> Unit + var dataSorted: (sorters: Sorter, rows: Array) -> Unit + var movableRowsSendingStart: (toTables: Array) -> Unit + var movableRowsSent: (fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit + var movableRowsSentFailed: (fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit + var movableRowsSendingStop: (toTables: Array) -> Unit + var movableRowsReceivingStart: (fromRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceived: (fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceivedFailed: (fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceivingStop: (fromTable: Tabulator) -> Unit + var movableRowsElementDrop: (event: UIEvent, element: Element, row: RowComponent) -> Unit + var dataGrouping: () -> Unit + var dataGrouped: (groups: Array) -> Unit + var groupVisibilityChanged: (group: GroupComponent, visible: Boolean) -> Unit + var localized: (locale: String, lang: Any) -> Unit + var renderStarted: () -> Unit + var renderComplete: () -> Unit + var columnMoved: (column: ColumnComponent, columns: Array) -> Unit + var columnResized: (column: ColumnComponent) -> Unit + var columnTitleChanged: (column: ColumnComponent) -> Unit + var columnVisibilityChanged: (column: ColumnComponent, visible: Boolean) -> Unit + var historyUndo: (action: String /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: Any, data: Array) -> Unit + var historyRedo: (action: String /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: Any, data: Array) -> Unit + var cellEditing: (cell: CellComponent) -> Unit + var cellEdited: (cell: CellComponent) -> Unit + var cellEditCancelled: (cell: CellComponent) -> Unit + var cellClick: (event: UIEvent, cell: CellComponent) -> Unit + var cellDblClick: (event: UIEvent, cell: CellComponent) -> Unit + var cellContext: (event: UIEvent, cell: CellComponent) -> Unit + var cellTap: (event: UIEvent, cell: CellComponent) -> Unit + var cellDblTap: (event: UIEvent, cell: CellComponent) -> Unit + var cellTapHold: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseEnter: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseLeave: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseOver: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseOut: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseMove: (event: UIEvent, cell: CellComponent) -> Unit + var dataLoadError: (error: Error) -> Unit + var dataProcessing: () -> Unit + var dataProcessed: () -> Unit +} + +external open class Tabulator { + constructor(selector: String, options: Options = definedExternally) + constructor(selector: String) + constructor(selector: HTMLElement, options: Options = definedExternally) + constructor(selector: HTMLElement) + + open var columnManager: Any + open var rowManager: Any + open var footerManager: Any + open var browser: String + open var browserSlow: Boolean + open var modules: Any + open var options: Options + open var element: HTMLElement + open var download: (downloadType: dynamic /* "csv" | "json" | "xlsx" | "pdf" | "html" | (columns: Array, data: Any, options: Any, setFileContents: Any) -> Any */, fileName: String, params: DownloadOptions, filter: String /* "visible" | "active" | "selected" | "all" */) -> Unit + open var downloadToTab: (downloadType: String /* "csv" | "json" | "xlsx" | "pdf" | "html" */, fileName: String, params: DownloadOptions) -> Unit + open var copyToClipboard: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */) -> Unit + open var undo: () -> Boolean + open var getHistoryUndoSize: () -> dynamic + open var redo: () -> Boolean + open var getHistoryRedoSize: () -> dynamic + open var getEditedCells: () -> Array + open var clearCellEdited: (clear: dynamic /* Tabulator.CellComponent | Array */) -> Unit + open var destroy: () -> Unit + open var setDataFromLocalFile: (extensions: String) -> Unit + open var setData: (data: Any, params: Any, config: Any) -> Promise + open var clearData: () -> Unit + open var getData: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Array + open var getDataCount: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Number + open var searchRows: (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any) -> Array + open var searchData: (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any) -> Array + open var getHtml: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */, style: Boolean, config: AddditionalExportOptions) -> Any + open var print: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */, style: Boolean, config: AddditionalExportOptions) -> Any + open var getAjaxUrl: () -> String + open var replaceData: (data: dynamic /* Array | String */, params: Any, config: Any) -> Promise + open var updateData: (data: Array) -> Promise + open var addData: (data: Array, addToTop: Boolean, positionTarget: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var updateOrAddData: (data: Array) -> Promise> + open var getRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> RowComponent + open var getRowFromPosition: (position: Number, activeOnly: Boolean) -> RowComponent + open var deleteRow: (index: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array | Array | Array */> */) -> Unit + open var addRow: (data: Any, addToTop: Boolean, positionTarget: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var updateOrAddRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, data: Any) -> Promise + open var updateRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, data: Any) -> Boolean + open var scrollToRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, position: String /* "top" | "center" | "bottom" | "nearest" */, ifVisible: Boolean) -> Promise + open var moveRow: (fromRow: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, toRow: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, placeAboveTarget: Boolean) -> Unit + open var getRows: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Array + open var getRowPosition: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, activeOnly: Boolean) -> Number + open var setColumns: (definitions: Array) -> Unit + open var getColumns: (includeColumnGroups: Boolean) -> Array + open var getColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> ColumnComponent + open var getColumnDefinitions: () -> Array + open var getColumnLayout: () -> Array + open var setColumnLayout: (layout: ColumnLayout) -> Unit + open var showColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var hideColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var toggleColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var addColumn: (definition: ColumnDefinition, insertRightOfTarget: Boolean, positionTarget: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Promise + open var deleteColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Promise + open var moveColumn: (fromColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, toColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, after: Boolean) -> Unit + open var scrollToColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, position: String /* "left" | "center" | "middle" | "right" */, ifVisible: Boolean) -> Promise + open var updateColumnDefinition: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, definition: ColumnDefinition) -> Promise + open var setLocale: (locale: dynamic /* String | Boolean */) -> Unit + open var getLocale: () -> String + open var getLang: (locale: String) -> Any + open var redraw: (force: Boolean) -> Unit + open var blockRedraw: () -> Unit + open var restoreRedraw: () -> Unit + open var setHeight: (height: dynamic /* Number | String */) -> Unit + open var setSort: (sortList: dynamic /* String | Array */, dir: String /* "asc" | "desc" */) -> Unit + open var getSorters: () -> Array + open var clearSort: () -> Unit + open var setFilter: (p1: dynamic /* String | Array | Array | (data: Any, filterParams: Any) -> Boolean */, p2: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | Any */, value: Any, filterParams: FilterParams) -> Unit + open var addFilter: FilterFunction + open var getFilters: (includeHeaderFilters: Boolean) -> Array + open var setHeaderFilterValue: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, value: String) -> Unit + open var setHeaderFilterFocus: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var getHeaderFilters: () -> Array + open var getHeaderFilterValue: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> String + open var removeFilter: FilterFunction + open var clearFilter: (includeHeaderFilters: Boolean) -> Unit + open var clearHeaderFilter: () -> Unit + open var selectRow: (lookup: dynamic /* Array | Array */> | "visible" | "active" | "selected" | "all" | Boolean */) -> Unit + open var deselectRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Unit + open var toggleSelectRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Unit + open var getSelectedRows: () -> Array + open var getSelectedData: () -> Array + open var setMaxPage: (max: Number) -> Unit + open var setPage: (page: dynamic /* Number | "first" | "prev" | "next" | "last" */) -> Promise + open var setPageToRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var setPageSize: (size: Number) -> Unit + open var getPageSize: () -> Number + open var previousPage: () -> Promise + open var nextPage: () -> Promise + open var getPage: () -> dynamic + open var getPageMax: () -> dynamic + open var setGroupBy: (groups: dynamic /* String | Array | (data: Any) -> Any */) -> Unit + open var setGroupStartOpen: (values: dynamic /* Boolean | (value: Any, count: Number, data: Any, group: Tabulator.GroupComponent) -> Boolean */) -> Unit + open var setGroupHeader: (values: dynamic /* (value: Any, count: Number, data: Any, group: Tabulator.GroupComponent) -> String | Array<(value: Any, count: Number, data: Any) -> String> */) -> Unit + open var getGroups: () -> Array + open var getGroupedData: (activeOnly: Boolean) -> Any + open var getCalcResults: () -> Any + open var recalc: () -> Unit + open var navigatePrev: () -> Unit + open var navigateNext: () -> Unit + open var navigateLeft: () -> Unit + open var navigateRight: () -> Unit + open var navigateUp: () -> Unit + open var navigateDown: () -> Unit + open var getInvalidCells: () -> Array + open var clearCellValidation: (clearType: dynamic /* Tabulator.CellComponent | Array */) -> Unit + open var validate: () -> dynamic + open var setGroupValues: (data: GroupValuesArg) -> Unit + open var refreshFilters: () -> Unit + open var clearHistory: () -> Unit + + // open var on: (event: K, callback: Any) -> Unit + // open var off: (event: K, callback: Any) -> Unit + interface Options : OptionsGeneral, OptionsMenu, OptionsHistory, OptionsLocale, OptionsDownload, OptionsColumns, + OptionsRows, OptionsData, OptionsSorting, OptionsFiltering, OptionsRowGrouping, OptionsPagination, + OptionsPersistentConfiguration, OptionsClipboard, OptionsDataTree, OptionsCells, OptionsDebug, OptionsHTML + + interface OptionsDebug { + var invalidOptionWarning: Boolean? + get() = definedExternally + set(value) = definedExternally + var debugInvalidOptions: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsCells : CellCallbacks { + var validationFailed: ((cell: CellComponent, value: Any, validators: dynamic /* Array | Array */) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsDataTree { + var dataTree: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeElementColumn: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeBranchElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeChildIndent: Number? + get() = definedExternally + set(value) = definedExternally + var dataTreeChildField: String? + get() = definedExternally + set(value) = definedExternally + var dataTreeCollapseElement: dynamic /* String? | HTMLElement? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeExpandElement: dynamic /* String? | HTMLElement? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeStartExpanded: dynamic /* Boolean? | Array? | ((row: RowComponent, level: Number) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeSelectPropagate: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeSort: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsClipboard { + var clipboard: dynamic /* Boolean? | "copy" | "paste" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyRowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyFormatter: dynamic /* "table" | ((type: String /* "plain" | "html" */, output: String) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyHeader: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboardPasteParser: dynamic /* String? | ((clipboard: Any) -> Array)? */ + get() = definedExternally + set(value) = definedExternally + var clipboardPasteAction: String? /* "insert" | "update" | "replace" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyStyled: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboardCopyConfig: dynamic /* AddditionalExportOptions? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopied: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var clipboardPasted: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var clipboardPasteError: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupHeaderClipboard: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupHeaderHtmlOutput: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsPersistentConfiguration { + var persistenceID: String? + get() = definedExternally + set(value) = definedExternally + var persistenceMode: dynamic /* "local" | "cookie" | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var persistentLayout: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistentSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistentFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistence: dynamic /* Boolean? | PersistenceOptions? */ + get() = definedExternally + set(value) = definedExternally + var persistenceWriterFunc: ((id: String, type: String? /* "sort" | "filter" | "group" | "page" | "columns" */, data: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var persistenceReaderFunc: ((id: String, type: String? /* "sort" | "filter" | "group" | "page" | "columns" */) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface PersistenceOptions { + var sort: Boolean? + get() = definedExternally + set(value) = definedExternally + var filter: Boolean? + get() = definedExternally + set(value) = definedExternally + var group: dynamic /* Boolean? | PersistenceGroupOptions? */ + get() = definedExternally + set(value) = definedExternally + var page: dynamic /* Boolean? | PersistencePageOptions? */ + get() = definedExternally + set(value) = definedExternally + var columns: dynamic /* Boolean? | Array? */ + get() = definedExternally + set(value) = definedExternally + } + + interface PersistenceGroupOptions { + var groupBy: Boolean? + get() = definedExternally + set(value) = definedExternally + var groupStartOpen: Boolean? + get() = definedExternally + set(value) = definedExternally + var groupHeader: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface PersistencePageOptions { + var size: Boolean? + get() = definedExternally + set(value) = definedExternally + var page: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsPagination { + var pagination: Boolean? + get() = definedExternally + set(value) = definedExternally + var paginationMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + var paginationSize: Number? + get() = definedExternally + set(value) = definedExternally + var paginationSizeSelector: dynamic /* Boolean? | Array? | Array? */ + get() = definedExternally + set(value) = definedExternally + var paginationElement: dynamic /* HTMLElement? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataReceiveParams: Record? + get() = definedExternally + set(value) = definedExternally + var dataSendParams: Record? + get() = definedExternally + set(value) = definedExternally + var paginationAddRow: String? /* "table" | "page" */ + get() = definedExternally + set(value) = definedExternally + var paginationButtonCount: Number? + get() = definedExternally + set(value) = definedExternally + var paginationInitialPage: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsRowGrouping { + var groupBy: dynamic /* String? | Array? | ((data: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var groupValues: GroupValuesArg? + get() = definedExternally + set(value) = definedExternally + var groupHeader: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupHeaderPrint: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupStartOpen: dynamic /* Boolean? | ((value: Any, count: Number, data: Any, group: GroupComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var groupToggleElement: dynamic /* "arrow" | "header" | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var groupClosedShowCalcs: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataGrouping: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataGrouped: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupVisibilityChanged: ((group: GroupComponent, visible: Boolean) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupClick: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupDblClick: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupContext: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupTap: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupDblTap: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupTapHold: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupUpdateOnCellEdit: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface Filter { + var field: String + var type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */ + var value: Any + } + + interface FilterParams { + var separator: String? + get() = definedExternally + set(value) = definedExternally + var matchAll: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsFiltering { + var initialFilter: Array? + get() = definedExternally + set(value) = definedExternally + var initialHeaderFilter: Array>? + get() = definedExternally + set(value) = definedExternally + var dataFiltering: ((filters: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataFiltered: ((filters: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilterDelay: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsSorting { + var initialSort: Array? + get() = definedExternally + set(value) = definedExternally + var sortOrderReverse: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface Sorter { + var column: String + var dir: String /* "asc" | "desc" */ + } + + interface SorterFromTable { + var column: ColumnComponent + var field: String + var dir: String /* "asc" | "desc" */ + } + + interface OptionsData { + var index: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + var data: Array? + get() = definedExternally + set(value) = definedExternally + var ajaxURL: String? + get() = definedExternally + set(value) = definedExternally + var ajaxParams: Any? + get() = definedExternally + set(value) = definedExternally + var ajaxConfig: dynamic /* "GET" | "POST" | AjaxConfig? */ + get() = definedExternally + set(value) = definedExternally + var ajaxContentType: dynamic /* "form" | "json" | AjaxContentType? */ + get() = definedExternally + set(value) = definedExternally + var ajaxURLGenerator: ((url: String, config: Any, params: Any) -> String)? + get() = definedExternally + set(value) = definedExternally + var ajaxRequestFunc: ((url: String, config: Any, params: Any) -> Promise)? + get() = definedExternally + set(value) = definedExternally + var ajaxFiltering: Boolean? + get() = definedExternally + set(value) = definedExternally + var ajaxSorting: Boolean? + get() = definedExternally + set(value) = definedExternally + var progressiveLoad: String? /* "load" | "scroll" */ + get() = definedExternally + set(value) = definedExternally + var progressiveLoadDelay: Number? + get() = definedExternally + set(value) = definedExternally + var progressiveLoadScrollMargin: Number? + get() = definedExternally + set(value) = definedExternally + var ajaxLoader: dynamic /* Boolean? | (() -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var ajaxLoaderLoading: String? + get() = definedExternally + set(value) = definedExternally + var ajaxLoaderError: String? + get() = definedExternally + set(value) = definedExternally + var ajaxRequesting: ((url: String, params: Any) -> Boolean)? + get() = definedExternally + set(value) = definedExternally + var ajaxResponse: ((url: String, params: Any, response: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var ajaxError: ((xhr: Any, textStatus: Any, errorThrown: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataLoader: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataLoaderLoading: String? + get() = definedExternally + set(value) = definedExternally + var dataLoaderError: String? + get() = definedExternally + set(value) = definedExternally + var sortMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + var filterMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + } + + interface AjaxContentType { + var headers: JSONRecord + var body: (url: String, config: Any, params: Any) -> Any + } + + interface AjaxConfig { + var method: String? /* "GET" | "POST" */ + get() = definedExternally + set(value) = definedExternally + var headers: JSONRecord? + get() = definedExternally + set(value) = definedExternally + var mode: String? + get() = definedExternally + set(value) = definedExternally + var credentials: String? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsRows { + var rowFormatter: ((row: RowComponent) -> Any)? + get() = definedExternally + set(value) = definedExternally + var rowFormatterPrint: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var rowFormatterHtmlOutput: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var rowFormatterClipboard: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var addRowPos: String? /* "bottom" | "top" */ + get() = definedExternally + set(value) = definedExternally + var selectable: dynamic /* Boolean? | Number? | "highlight" */ + get() = definedExternally + set(value) = definedExternally + var selectableRangeMode: String? /* "click" */ + get() = definedExternally + set(value) = definedExternally + var selectableRollingSelection: Boolean? + get() = definedExternally + set(value) = definedExternally + var selectablePersistence: Boolean? + get() = definedExternally + set(value) = definedExternally + var selectableCheck: ((row: RowComponent) -> Boolean)? + get() = definedExternally + set(value) = definedExternally + var movableRows: Boolean? + get() = definedExternally + set(value) = definedExternally + var movableRowsConnectedTables: dynamic /* String? | Array? | HTMLElement? | Array? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsSender: dynamic /* Boolean? | "delete" | ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsReceiver: dynamic /* "insert" | "add" | "update" | "replace" | ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsConnectedElements: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsElementDrop: ((e: MouseEvent, element: HTMLElement, row: RowComponent) -> Any)? + get() = definedExternally + set(value) = definedExternally + var resizableRows: Boolean? + get() = definedExternally + set(value) = definedExternally + var scrollToRowPosition: String? /* "top" | "center" | "bottom" | "nearest" */ + get() = definedExternally + set(value) = definedExternally + var scrollToRowIfVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeRowExpanded: ((row: RowComponent, level: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataTreeRowCollapsed: ((row: RowComponent, level: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSendingStart: ((toTables: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSent: ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSentFailed: ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSendingStop: ((toTables: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivingStart: ((fromRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceived: ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivedFailed: ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivingStop: ((fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var rowClick: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowDblClick: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowContext: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowTap: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowDblTap: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowTapHold: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseEnter: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseLeave: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseOver: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseOut: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseMove: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowAdded: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowUpdated: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowDeleted: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowMoved: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowResized: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowSelectionChanged: ((data: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var rowSelected: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowDeselected: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var tabEndNewRow: dynamic /* Boolean? | JSONRecord? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsColumns { + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var autoColumns: Boolean? + get() = definedExternally + set(value) = definedExternally + var autoColumnsDefinitions: dynamic /* ((columnDefinitions: Array) -> Array)? | Array? | Record? */ + get() = definedExternally + set(value) = definedExternally + var layout: String? /* "fitData" | "fitColumns" | "fitDataFill" | "fitDataStretch" | "fitDataTable" */ + get() = definedExternally + set(value) = definedExternally + var layoutColumnsOnNewData: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayout: dynamic /* Boolean? | "hide" | "collapse" */ + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseStartOpen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseUseFormatters: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseFormatter: ((data: Array) -> Any)? + get() = definedExternally + set(value) = definedExternally + var movableColumns: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnHeaderVertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var scrollToColumnPosition: String? /* "left" | "center" | "middle" | "right" */ + get() = definedExternally + set(value) = definedExternally + var scrollToColumnIfVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnCalcs: dynamic /* Boolean? | "both" | "table" | "group" */ + get() = definedExternally + set(value) = definedExternally + var nestedFieldSeparator: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var columnHeaderSortMulti: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnMoved: ((column: ColumnComponent, columns: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnResized: ((column: ColumnComponent) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnVisibilityChanged: ((column: ColumnComponent, visible: Boolean) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnTitleChanged: ((column: ColumnComponent) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var headerVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var print: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortElement: String? + get() = definedExternally + set(value) = definedExternally + var columnDefaults: ColumnDefinition? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsCell { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsGeneral { + var height: dynamic /* String? | Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var maxHeight: dynamic /* String? | Number? */ + get() = definedExternally + set(value) = definedExternally + var minHeight: dynamic /* String? | Number? */ + get() = definedExternally + set(value) = definedExternally + var renderVertical: dynamic /* "virtual" | "basic" | Renderer? */ + get() = definedExternally + set(value) = definedExternally + var renderHorizontal: dynamic /* "virtual" | "basic" | Renderer? */ + get() = definedExternally + set(value) = definedExternally + var renderVerticalBuffer: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + var placeholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var footerElement: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var tooltipGenerationMode: String? /* "load" | "hover" */ + get() = definedExternally + set(value) = definedExternally + var keybindings: dynamic /* Boolean? | KeyBinding? */ + get() = definedExternally + set(value) = definedExternally + var reactiveData: Boolean? + get() = definedExternally + set(value) = definedExternally + var autoResize: Boolean? + get() = definedExternally + set(value) = definedExternally + var tableBuilding: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var tableBuilt: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var renderStarted: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var renderComplete: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var htmlImporting: EmptyCallback? + get() = definedExternally + set(value) = definedExternally + var htmlImported: EmptyCallback? + get() = definedExternally + set(value) = definedExternally + var dataChanged: ((data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var pageLoaded: ((pageno: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataSorting: ((sorters: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataSorted: ((sorters: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var invalidOptionWarnings: Boolean? + get() = definedExternally + set(value) = definedExternally + var scrollVertical: ((top: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var scrollHorizontal: ((left: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var validationMode: String? /* "blocking" | "highlight" | "manual" */ + get() = definedExternally + set(value) = definedExternally + var textDirection: String? /* "auto" | "ltr" | "rtl" */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsMenu { + var rowContextMenu: dynamic /* Array | MenuSeparator */>? | ((component: RowComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var rowClickMenu: dynamic /* Array | MenuSeparator */>? | ((component: RowComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var groupClickMenu: dynamic /* Array | MenuSeparator */>? | ((component: GroupComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var groupContextMenu: Array>? + get() = definedExternally + set(value) = definedExternally + } + + interface MenuObject { + var label: dynamic /* String | HTMLElement | (component: T) -> dynamic */ + get() = definedExternally + set(value) = definedExternally + var action: ((e: Any, component: T) -> Any)? + get() = definedExternally + set(value) = definedExternally + var disabled: dynamic /* Boolean? | ((component: T) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var menu: Array>? + get() = definedExternally + set(value) = definedExternally + } + + interface MenuSeparator { + var separator: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadOptions : DownloadCSV, DownloadXLXS, DownloadPDF, DownloadHTML { + override var documentProcessing: ((input: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadCSV { + var delimiter: String? + get() = definedExternally + set(value) = definedExternally + var bom: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadHTML { + var style: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadXLXS { + var sheetName: String? + get() = definedExternally + set(value) = definedExternally + var documentProcessing: ((input: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadPDF { + var orientation: String? /* "portrait" | "landscape" */ + get() = definedExternally + set(value) = definedExternally + var title: String? + get() = definedExternally + set(value) = definedExternally + var rowGroupStyles: Any? + get() = definedExternally + set(value) = definedExternally + var rowCalcStyles: Any? + get() = definedExternally + set(value) = definedExternally + var jsPDF: Any? + get() = definedExternally + set(value) = definedExternally + var autoTable: dynamic /* Any? | ((doc: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var documentProcessing: ((doc: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsDownload { + var downloadReady: ((fileContents: Any, blob: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var downloadComplete: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var downloadConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var downloadRowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsHTML { + var htmlOutputConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var printAsHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var printConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var printStyled: Boolean? + get() = definedExternally + set(value) = definedExternally + var printRowRange: dynamic /* "visible" | "active" | "selected" | "all" | (() -> Array)? */ + get() = definedExternally + set(value) = definedExternally + var printHeader: dynamic /* String? | HTMLElement? | (() -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var printFooter: dynamic /* String? | HTMLElement? | (() -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var printFormatter: ((tableHolderElement: Any, tableElement: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var groupHeaderDownload: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + } + + interface AddditionalExportOptions { + var columnHeaders: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnGroups: Boolean? + get() = definedExternally + set(value) = definedExternally + var rowGroups: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnCalcs: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTree: Boolean? + get() = definedExternally + set(value) = definedExternally + var formatCells: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsLocale { + var locale: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var langs: Any? + get() = definedExternally + set(value) = definedExternally + var localized: ((locale: String, lang: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsHistory { + var history: Boolean? + get() = definedExternally + set(value) = definedExternally + var historyUndo: ((action: String? /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: dynamic /* CellComponent | RowComponent */, data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var historyRedo: ((action: String? /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: dynamic /* CellComponent | RowComponent */, data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnLayout { + var title: String + var field: String? + get() = definedExternally + set(value) = definedExternally + var visible: Boolean? + get() = definedExternally + set(value) = definedExternally + var width: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnLayoutPartial { + var title: String? + get() = definedExternally + set(value) = definedExternally + var field: String? + get() = definedExternally + set(value) = definedExternally + var visible: Boolean? + get() = definedExternally + set(value) = definedExternally + var width: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinition : ColumnLayout, CellCallbacks { + var hozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var headerHozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var vertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var minWidth: Number? + get() = definedExternally + set(value) = definedExternally + var widthGrow: Number? + get() = definedExternally + set(value) = definedExternally + var widthShrink: Number? + get() = definedExternally + set(value) = definedExternally + var resizable: dynamic /* Boolean? | "header" | "cell" */ + get() = definedExternally + set(value) = definedExternally + var frozen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsive: Number? + get() = definedExternally + set(value) = definedExternally + var tooltip: dynamic /* String? | Boolean? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var cssClass: String? + get() = definedExternally + set(value) = definedExternally + var rowHandle: Boolean? + get() = definedExternally + set(value) = definedExternally + var hideInHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var sorter: dynamic /* "string" | "number" | "alphanum" | "boolean" | "exists" | "date" | "time" | "datetime" | "array" | ((a: Any, b: Any, aRow: RowComponent, bRow: RowComponent, column: ColumnComponent, dir: String /* "asc" | "desc" */, sorterParams: Any) -> Number)? */ + get() = definedExternally + set(value) = definedExternally + var sorterParams: dynamic /* ColumnDefinitionSorterParams? | ColumnSorterParamLookupFunction? */ + get() = definedExternally + set(value) = definedExternally + var formatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var formatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var variableHeight: Boolean? + get() = definedExternally + set(value) = definedExternally + var editable: dynamic /* Boolean? | ((cell: CellComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var editor: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var editorParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var validator: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | Array? | Validator? | Array? | String? */ + get() = definedExternally + set(value) = definedExternally + var mutator: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorData: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorDataParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorEdit: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorEditParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorClipboard: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessor: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorDownload: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorDownloadParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorClipboard: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleDownload: String? + get() = definedExternally + set(value) = definedExternally + var topCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var topCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortStartingDir: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + var headerSortTristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerContext: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTapHold: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTooltip: dynamic /* Boolean? | String? | ((column: ColumnComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var headerVertical: dynamic /* Boolean? | "flip" */ + get() = definedExternally + set(value) = definedExternally + var editableTitle: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var titleFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilter: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterPlaceholder: String? + get() = definedExternally + set(value) = definedExternally + var headerFilterEmptyCheck: ValueBooleanCallback? + get() = definedExternally + set(value) = definedExternally + var headerFilterFunc: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | ((headerValue: Any, rowValue: Any, rowdata: Any, filterparams: Any) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterFuncParams: Any? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var htmlOutput: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboard: Boolean? + get() = definedExternally + set(value) = definedExternally + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var headerMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var headerContextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var contextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var clickMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var formatterClipboard: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterClipboardParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrint: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrintParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorPrint: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorPrintParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutput: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutputParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutput: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutputParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var titleClipboard: String? + get() = definedExternally + set(value) = definedExternally + var titleHtmlOutput: String? + get() = definedExternally + set(value) = definedExternally + var titlePrint: String? + get() = definedExternally + set(value) = definedExternally + var maxWidth: dynamic /* Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinitionPartial : ColumnLayoutPartial, CellCallbacksPartial { + var hozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var headerHozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var vertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var minWidth: Number? + get() = definedExternally + set(value) = definedExternally + var widthGrow: Number? + get() = definedExternally + set(value) = definedExternally + var widthShrink: Number? + get() = definedExternally + set(value) = definedExternally + var resizable: dynamic /* Boolean? | "header" | "cell" */ + get() = definedExternally + set(value) = definedExternally + var frozen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsive: Number? + get() = definedExternally + set(value) = definedExternally + var tooltip: dynamic /* String? | Boolean? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var cssClass: String? + get() = definedExternally + set(value) = definedExternally + var rowHandle: Boolean? + get() = definedExternally + set(value) = definedExternally + var hideInHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var sorter: dynamic /* "string" | "number" | "alphanum" | "boolean" | "exists" | "date" | "time" | "datetime" | "array" | ((a: Any, b: Any, aRow: RowComponent, bRow: RowComponent, column: ColumnComponent, dir: String /* "asc" | "desc" */, sorterParams: Any) -> Number)? */ + get() = definedExternally + set(value) = definedExternally + var sorterParams: dynamic /* ColumnDefinitionSorterParams? | ColumnSorterParamLookupFunction? */ + get() = definedExternally + set(value) = definedExternally + var formatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var formatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var variableHeight: Boolean? + get() = definedExternally + set(value) = definedExternally + var editable: dynamic /* Boolean? | ((cell: CellComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var editor: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var editorParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var validator: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | Array? | Validator? | Array? | String? */ + get() = definedExternally + set(value) = definedExternally + var mutator: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorData: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorDataParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorEdit: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorEditParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorClipboard: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessor: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorDownload: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorDownloadParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorClipboard: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleDownload: String? + get() = definedExternally + set(value) = definedExternally + var topCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var topCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortStartingDir: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + var headerSortTristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerContext: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTapHold: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTooltip: dynamic /* Boolean? | String? | ((column: ColumnComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var headerVertical: dynamic /* Boolean? | "flip" */ + get() = definedExternally + set(value) = definedExternally + var editableTitle: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var titleFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilter: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterPlaceholder: String? + get() = definedExternally + set(value) = definedExternally + var headerFilterEmptyCheck: ValueBooleanCallback? + get() = definedExternally + set(value) = definedExternally + var headerFilterFunc: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | ((headerValue: Any, rowValue: Any, rowdata: Any, filterparams: Any) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterFuncParams: Any? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var htmlOutput: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboard: Boolean? + get() = definedExternally + set(value) = definedExternally + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var headerMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var headerContextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var contextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var clickMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var formatterClipboard: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterClipboardParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrint: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrintParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorPrint: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorPrintParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutput: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutputParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutput: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutputParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var titleClipboard: String? + get() = definedExternally + set(value) = definedExternally + var titleHtmlOutput: String? + get() = definedExternally + set(value) = definedExternally + var titlePrint: String? + get() = definedExternally + set(value) = definedExternally + var maxWidth: dynamic /* Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface CellCallbacks { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface CellCallbacksPartial { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinitionSorterParams { + var format: String? + get() = definedExternally + set(value) = definedExternally + var locale: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var alignEmptyValues: String? /* "top" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var type: String? /* "length" | "sum" | "max" | "min" | "avg" */ + get() = definedExternally + set(value) = definedExternally + } + + interface MoneyParams { + var decimal: String? + get() = definedExternally + set(value) = definedExternally + var thousand: String? + get() = definedExternally + set(value) = definedExternally + var symbol: String? + get() = definedExternally + set(value) = definedExternally + var symbolAfter: Boolean? + get() = definedExternally + set(value) = definedExternally + var precision: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ImageParams { + var height: String? + get() = definedExternally + set(value) = definedExternally + var width: String? + get() = definedExternally + set(value) = definedExternally + var urlPrefix: String? + get() = definedExternally + set(value) = definedExternally + var urlSuffix: String? + get() = definedExternally + set(value) = definedExternally + } + + interface LinkParams { + var labelField: String? + get() = definedExternally + set(value) = definedExternally + var label: dynamic /* String? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var urlPrefix: String? + get() = definedExternally + set(value) = definedExternally + var urlField: String? + get() = definedExternally + set(value) = definedExternally + var url: dynamic /* String? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var target: String? + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DateTimeParams { + var inputFormat: String? + get() = definedExternally + set(value) = definedExternally + var outputFormat: String? + get() = definedExternally + set(value) = definedExternally + var invalidPlaceholder: dynamic /* Boolean? | String? | Number? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var timezone: String? + get() = definedExternally + set(value) = definedExternally + } + + interface DateTimeDifferenceParams : DateTimeParams { + var date: Any? + get() = definedExternally + set(value) = definedExternally + var humanize: Boolean? + get() = definedExternally + set(value) = definedExternally + var unit: String? /* "years" | "months" | "weeks" | "days" | "hours" | "minutes" | "seconds" */ + get() = definedExternally + set(value) = definedExternally + var suffix: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface TickCrossParams { + var allowEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var allowTruthy: Boolean? + get() = definedExternally + set(value) = definedExternally + var tickElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var crossElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface TrafficParams { + var min: Number? + get() = definedExternally + set(value) = definedExternally + var max: Number? + get() = definedExternally + set(value) = definedExternally + var color: dynamic /* String? | Array? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ProgressBarParams : TrafficParams { + var legend: dynamic /* String? | Boolean? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var legendColor: dynamic /* String? | Array? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var legendAlign: String? /* "center" | "left" | "right" | "justify" */ + get() = definedExternally + set(value) = definedExternally + } + + interface StarRatingParams { + var stars: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface RowSelectionParams { + var rowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + } + + interface SharedEditorParams { + var elementAttributes: JSONRecord? + get() = definedExternally + set(value) = definedExternally + var mask: String? + get() = definedExternally + set(value) = definedExternally + var maskAutoFill: Boolean? + get() = definedExternally + set(value) = definedExternally + var maskLetterChar: String? + get() = definedExternally + set(value) = definedExternally + var maskNumberChar: String? + get() = definedExternally + set(value) = definedExternally + var maskWildcardChar: String? + get() = definedExternally + set(value) = definedExternally + } + + interface NumberParams : SharedEditorParams { + var min: Number? + get() = definedExternally + set(value) = definedExternally + var max: Number? + get() = definedExternally + set(value) = definedExternally + var step: Number? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" */ + get() = definedExternally + set(value) = definedExternally + } + + interface InputParams : SharedEditorParams { + var search: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface TextAreaParams : SharedEditorParams { + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + } + + interface CheckboxParams : SharedEditorParams { + var tristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var indeterminateValue: String? + get() = definedExternally + set(value) = definedExternally + } + + interface SharedSelectAutoCompleteEditorParams { + var defaultValue: String? + get() = definedExternally + set(value) = definedExternally + var sortValuesList: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + } + + interface SelectParams : SharedEditorParams, SharedSelectAutoCompleteEditorParams { + var values: dynamic /* Boolean | Array | JSONRecord | Array | String */ + get() = definedExternally + set(value) = definedExternally + var listItemFormatter: ((value: String, text: String) -> String)? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + var multiselect: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + } + + interface SelectParamsGroup { + var label: String + var value: dynamic /* String? | Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var options: Array? + get() = definedExternally + set(value) = definedExternally + var elementAttributes: Any? + get() = definedExternally + set(value) = definedExternally + } + + interface SelectLabelValue { + var label: String + var value: dynamic /* String | Number | Boolean */ + get() = definedExternally + set(value) = definedExternally + } + + interface AutoCompleteParams : SharedEditorParams, SharedSelectAutoCompleteEditorParams { + var values: dynamic /* Boolean | Array | JSONRecord | String | Array */ + get() = definedExternally + set(value) = definedExternally + var listItemFormatter: ((value: String, text: String) -> String)? + get() = definedExternally + set(value) = definedExternally + var searchFunc: ((term: String, values: Array) -> dynamic)? + get() = definedExternally + set(value) = definedExternally + var allowEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var freetext: Boolean? + get() = definedExternally + set(value) = definedExternally + var showListOnEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + var searchingPlaceholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var emptyPlaceholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + } + + interface Validator { + var type: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | (cell: CellComponent, value: Any, parameters: Any) -> Boolean */ + get() = definedExternally + set(value) = definedExternally + var parameters: Any? + get() = definedExternally + set(value) = definedExternally + } + + interface KeyBinding { + var navPrev: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navNext: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navLeft: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navRight: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navUp: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navDown: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var undo: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var redo: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollPageUp: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollPageDown: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollToStart: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollToEnd: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var copyToClipboard: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface CalculationComponent { + var getData: () -> Any + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getCells: () -> Array + var getCell: (column: dynamic /* ColumnComponent | HTMLElement | String */) -> CellComponent + } + + interface RowComponent : CalculationComponent { + var getNextRow: () -> dynamic + var getPrevRow: () -> dynamic + var getIndex: () -> Any + var getPosition: (filteredPosition: Boolean) -> Number + var getGroup: () -> GroupComponent + var delete: () -> Promise + var scrollTo: () -> Promise + var pageTo: () -> Promise + var move: (lookup: dynamic /* RowComponent | HTMLElement | Number */, belowTarget: Boolean) -> Unit + var update: (data: Any) -> Promise + var select: () -> Unit + var deselect: () -> Unit + var toggleSelect: () -> Unit + var isSelected: () -> Boolean + var normalizeHeight: () -> Unit + var reformat: () -> Unit + var freeze: () -> Unit + var unfreeze: () -> Unit + var treeExpand: () -> Unit + var treeCollapse: () -> Unit + var treeToggle: () -> Unit + var getTreeParent: () -> dynamic + var getTreeChildren: () -> Array + var addTreeChild: (rowData: Any, position: Boolean, existingRow: RowComponent) -> Unit + var validate: () -> dynamic + var isFrozen: () -> Boolean + } + + interface GroupComponent { + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getKey: () -> Any + var getField: () -> String + var getRows: () -> Array + var getSubGroups: () -> Array + var getParentGroup: () -> dynamic + var isVisible: () -> Boolean + var show: () -> Unit + var hide: () -> Unit + var toggle: () -> Unit + } + + interface ColumnComponent { + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getDefinition: () -> ColumnDefinition + var getField: () -> String + var getCells: () -> Array + var getNextColumn: () -> dynamic + var getPrevColumn: () -> dynamic + var move: (toColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, after: Boolean) -> Unit + var isVisible: () -> Boolean + var show: () -> Unit + var hide: () -> Unit + var toggle: () -> Unit + var delete: () -> Promise + var scrollTo: () -> Promise + var getSubColumns: () -> Array + var getParentColumn: () -> dynamic + var headerFilterFocus: () -> Unit + var setHeaderFilterValue: (value: Any) -> Unit + var reloadHeaderFilter: () -> Unit + var getHeaderFilterValue: () -> Any + var updateDefinition: (definition: ColumnDefinition) -> Promise + var getWidth: () -> Number + var setWidth: (width: dynamic /* Number | Boolean */) -> Unit + var validate: () -> dynamic + } + + interface CellComponent { + var getValue: () -> Any + var getOldValue: () -> Any + var restoreOldValue: () -> Any + var getInitialValue: () -> Any + var restoreInitialValue: () -> Any + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getRow: () -> RowComponent + var getColumn: () -> ColumnComponent + var getData: () -> Any + var getField: () -> String + var setValue: (value: Any, mutate: Boolean) -> Unit + var checkHeight: () -> Unit + var edit: (ignoreEditable: Boolean) -> Unit + var cancelEdit: () -> Unit + var navigatePrev: () -> Boolean + var navigateNext: () -> Boolean + var navigateLeft: () -> Boolean + var navigateRight: () -> Boolean + var navigateUp: () -> Unit + var navigateDown: () -> Unit + var isEdited: () -> Boolean + var clearEdited: () -> Unit + var isValid: () -> Boolean + var clearValidation: () -> Unit + var validate: () -> Boolean + } + + companion object { + var defaultOptions: Options + var extendModule: (name: String, property: String, values: Any) -> Unit + var findTable: (query: String) -> Array + var registerModule: (module: Module) -> Unit + var bindModules: (__0: Any) -> Unit + } +} + +external open class Module(table: Tabulator) { + companion object { + var moduleName: String + } +} + +external open class AccessorModule + +external open class AjaxModule + +external open class ClipboardModule + +external open class ColumnCalcsModule + +external open class DataTreeModule + +external open class DownloadModule + +external open class EditModule + +external open class ExportModule + +external open class FilterModule + +external open class FormatModule + +external open class FrozenColumnsModule + +external open class FrozenRowsModule + +external open class GroupRowsModule + +external open class HistoryModule + +external open class HtmlTableImportModule + +external open class InteractionModule + +external open class KeybindingsModule + +external open class MenuModule + +external open class MoveColumnsModule + +external open class MoveRowsModule + +external open class MutatorModule + +external open class PageModule + +external open class PersistenceModule + +external open class PrintModule + +external open class PseudoRow + +external open class ReactiveDataModule + +external open class Renderer + +external open class ResizeColumnsModule + +external open class ResizeRowsModule + +external open class ResizeTableModule + +external open class ResponsiveLayoutModule + +external open class SelectRowModule + +external open class SortModule + +external open class TabulatorFull : Tabulator { + constructor(selector: String, options: Options = definedExternally) + constructor(selector: String) + constructor(selector: HTMLElement, options: Options = definedExternally) + constructor(selector: HTMLElement) +} + +external open class ValidateModule \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt new file mode 100644 index 00000000..28dced17 --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt @@ -0,0 +1,45 @@ +@file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING") + +package tabulator + +import org.w3c.dom.events.UIEvent + +@Suppress("UNUSED_TYPEALIAS_PARAMETER") +internal typealias Pick = Any + +@Suppress("UNUSED_TYPEALIAS_PARAMETER") +internal typealias Record = Any + +internal typealias FilterFunction = (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any, filterParams: Tabulator.FilterParams) -> Unit + +internal typealias GroupValuesArg = Array> + +internal typealias CustomMutator = (value: Any, data: Any, type: String /* "data" | "edit" */, mutatorParams: Any, cell: Tabulator.CellComponent) -> Any + +internal typealias CustomAccessor = (value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, AccessorParams: Any, column: Tabulator.ColumnComponent, row: Tabulator.RowComponent) -> Any + +internal typealias ColumnCalcParams = (values: Any, data: Any) -> Any + +internal typealias ValueStringCallback = (value: Any) -> String + +internal typealias ValueBooleanCallback = (value: Any) -> Boolean + +internal typealias ValueVoidCallback = (value: Any) -> Unit + +internal typealias EmptyCallback = (callback: () -> Unit) -> Unit + +internal typealias CellEventCallback = (e: UIEvent, cell: Tabulator.CellComponent) -> Unit + +internal typealias CellEditEventCallback = (cell: Tabulator.CellComponent) -> Unit + +internal typealias ColumnEventCallback = (e: UIEvent, column: Tabulator.ColumnComponent) -> Unit + +internal typealias RowEventCallback = (e: UIEvent, row: Tabulator.RowComponent) -> Unit + +internal typealias RowChangedCallback = (row: Tabulator.RowComponent) -> Unit + +internal typealias GroupEventCallback = (e: UIEvent, group: Tabulator.GroupComponent) -> Unit + +internal typealias JSONRecord = Record + +internal typealias ColumnSorterParamLookupFunction = (column: Tabulator.ColumnComponent, dir: String /* "asc" | "desc" */) -> Any \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 34ee5ed1..02586120 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -5,6 +5,7 @@ import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.TextBufferGeometry import info.laht.threekt.objects.Mesh import kotlinext.js.jsObject +import kotlinext.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange @@ -18,7 +19,7 @@ public object ThreeLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class override fun invoke(three: ThreePlugin, obj: SolidLabel): Object3D { - val textGeo = TextBufferGeometry(obj.text, jsObject { + val textGeo = TextBufferGeometry(obj.text, jso { font = obj.fontFamily size = 20 height = 1 -- 2.34.1 From faeefe857260dd84ef4e3fedd9f1454cbcf84b07 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 16:56:33 +0300 Subject: [PATCH 054/143] Fix build version --- build.gradle.kts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a81d1656..c167a23f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,11 @@ plugins { val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") +allprojects{ + group = "space.kscience" + version = "0.2.0-dev-99" +} + subprojects { if (name.startsWith("visionforge")) apply() @@ -14,10 +19,6 @@ subprojects { mavenCentral() maven("https://maven.jzy3d.org/releases") } - - group = "space.kscience" - version = "0.2.0-dev-99" - } ksciencePublish { -- 2.34.1 From e70ef813de55e4fbd98abec733752ed522f6e5f7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:12:59 +0300 Subject: [PATCH 055/143] Update build.yml --- .github/workflows/build.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 412460ae..c4663660 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,16 +7,15 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 timeout-minutes: 40 steps: - uses: actions/checkout@v2 - - uses: DeLaGuardo/setup-graalvm@4.0 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - uses: actions/cache@v2 + java-version: 11 + - uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches @@ -24,10 +23,4 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} restore-keys: | ${{ runner.os }}-gradle- - - uses: actions/cache@v2 - with: - path: ~/.konan - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - run: ./gradlew build --build-cache --no-daemon --stacktrace -- 2.34.1 From 6260117c681d0977bade90721a37d036cd3806e3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:26:16 +0300 Subject: [PATCH 056/143] Update build.yml --- .github/workflows/build.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4663660..be3f335b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,12 +15,8 @@ jobs: uses: actions/setup-java@v2.5.0 with: java-version: 11 - - uses: actions/cache@v2.1.7 + distribution: jdk + - name: execute build + uses: gradle/gradle-build-action@v2 with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - run: ./gradlew build --build-cache --no-daemon --stacktrace + arguments: build -- 2.34.1 From d278427f662853af438b21a6043172a0e72db1e9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:34:55 +0300 Subject: [PATCH 057/143] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be3f335b..66ef7f0c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: uses: actions/setup-java@v2.5.0 with: java-version: 11 - distribution: jdk + distribution: liberica - name: execute build uses: gradle/gradle-build-action@v2 with: -- 2.34.1 From cebef9472a305f935759ef3e4d38846ac7e4436f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:47:21 +0300 Subject: [PATCH 058/143] Update build.yml --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 66ef7f0c..cbf40304 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,9 @@ jobs: with: java-version: 11 distribution: liberica + - uses: actions/setup-node@v2.5.1 + with: + node-version: '16' - name: execute build uses: gradle/gradle-build-action@v2 with: -- 2.34.1 From 30fa35bef5a1f0ef48358c67991c7835e3eebb72 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:01:52 +0300 Subject: [PATCH 059/143] Add lock file --- build.gradle.kts | 10 +- kotlin-js-store/yarn.lock | 9201 +++++++++++++++++++++++++++++++++++++ 2 files changed, 9202 insertions(+), 9 deletions(-) create mode 100644 kotlin-js-store/yarn.lock diff --git a/build.gradle.kts b/build.gradle.kts index c167a23f..664171c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,12 +31,4 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") - -//workaround for https://youtrack.jetbrains.com/issue/KT-48273 -rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.apply { - webpack.version = "5.64.3" - webpackDevServer.version = "4.5.0" - } -} \ No newline at end of file +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") \ No newline at end of file diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 00000000..df058368 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,9201 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"3d-view@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.1.tgz#2e174571c48215736b376bb66938a3513dad2179" + integrity sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA== + dependencies: + matrix-camera-controller "^2.1.1" + orbit-camera-controller "^4.0.0" + turntable-camera-controller "^3.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.0" + +"@babel/plugin-transform-react-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.14.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" + integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-strict-mode@^7.12.13": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz#2be5ad4f087c188cfed6f01e327a9ccd4dc0c488" + integrity sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.14.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.13.13": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" + +"@babel/preset-typescript@^7.14.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.16.0" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.4.5": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + +"@csstools/convert-colors@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-2.0.0.tgz#6dd323583b40cfe05aaaca30debbb30f26742bbf" + integrity sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" + integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== + +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@jetbrains/angular-elastic@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz#ddfffdd3941eaf839fd29069fc8faf7536329988" + integrity sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q== + dependencies: + angular ">=1.0.6" + +"@jetbrains/babel-preset-jetbrains@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.2.tgz#b62fab630080c5e78513e2cdbe85d4940f4e3164" + integrity sha512-hC8HpdxftzMc2OwwzKIsBzq/8paGT/+IcH7TZfy0RWusq0K1wWnjRQMH5o9J0RkdARlDnOxDxEHYA9fE6DFKLw== + dependencies: + "@babel/plugin-transform-runtime" "^7.14.3" + "@babel/plugin-transform-strict-mode" "^7.12.13" + "@babel/preset-env" "^7.14.4" + "@babel/preset-react" "^7.13.13" + "@babel/preset-typescript" "^7.14.5" + "@babel/runtime" "^7.14.0" + babel-plugin-angularjs-annotate "^0.10.0" + +"@jetbrains/icons@^3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@jetbrains/icons/-/icons-3.18.0.tgz#96d3ff8f9029b9f196a9a936cd2c6797aa2c17f2" + integrity sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA== + +"@jetbrains/logos@^1.4.27": + version "1.4.27" + resolved "https://registry.yarnpkg.com/@jetbrains/logos/-/logos-1.4.27.tgz#4412ed2abaf74756e44bb84643431fc270ec3031" + integrity sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA== + +"@jetbrains/postcss-require-hover@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz#927f24fa7cb27e3a3ed2c4eca716e5a206577e18" + integrity sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw== + dependencies: + postcss "^6.0.1" + +"@jetbrains/ring-ui@^4.1.5": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@jetbrains/ring-ui/-/ring-ui-4.1.6.tgz#bb1d95a169dc5b8b0915258d772fbbd99ad739bf" + integrity sha512-/HFw77+gzN6YxsaGG5Wga4ZOwfs65GfailwCoY4Xdm05OqWHKIJmzTr0+Tc0w12Lg9Km7ymxrRIOQKcXOdjSFQ== + dependencies: + "@babel/core" "^7.16.0" + "@jetbrains/angular-elastic" "^2.5.1" + "@jetbrains/babel-preset-jetbrains" "^2.3.2" + "@jetbrains/icons" "^3.18.0" + "@jetbrains/logos" "^1.4.27" + "@jetbrains/postcss-require-hover" "^0.1.2" + "@ungap/url-search-params" "^0.2.2" + babel-loader "^8.2.3" + babel-plugin-transform-define "^2.0.1" + browserslist "^4.16.6" + change-case "^4.1.1" + classnames "^2.3.1" + combokeys "^3.0.1" + compile-code-loader "^1.0.0" + conic-gradient "^1.0.0" + css-loader "^6.5.1" + date-fns "^2.27.0" + deep-equal "^2.0.4" + element-resize-detector "^1.2.3" + es6-error "^4.1.1" + eslint-plugin-react-hooks "^4.3.0" + extricate-loader "^3.0.0" + fastdom "^1.0.10" + file-loader "^6.2.0" + focus-trap "^6.7.1" + focus-visible "^5.2.0" + highlight.js "^10.7.2" + html-loader "^3.0.1" + interpolate-loader "^2.0.1" + just-debounce-it "^3.0.1" + memoize-one "^6.0.0" + postcss "^8.4.4" + postcss-calc "^8.0.0" + postcss-flexbugs-fixes "^5.0.2" + postcss-font-family-system-ui "^5.0.0" + postcss-loader "^6.2.1" + postcss-modules-values-replace "^3.4.0" + postcss-preset-env "^7.0.1" + prop-types "^15.7.2" + react-markdown "^5.0.3" + react-movable "^3.0.2" + react-virtualized "^9.22.3" + react-waypoint "^10.1.0" + remark-breaks "^3.0.2" + remark-gfm "^1.0.0" + scrollbar-width "^3.1.1" + simply-uuid "^1.0.1" + sniffr "^1.2.0" + style-inject "^0.3.0" + style-loader "~3.3.1" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1" + integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.5" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.1.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@plotly/d3-sankey-circular@0.33.1": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" + integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== + dependencies: + d3-array "^1.2.1" + d3-collection "^1.0.4" + d3-shape "^1.2.0" + elementary-circuits-directed-graph "^1.0.4" + +"@plotly/d3-sankey@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" + integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +"@plotly/point-cluster@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" + integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== + dependencies: + array-bounds "^1.0.1" + binary-search-bounds "^2.0.4" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@turf/area@^6.0.1": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" + integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/bbox@^6.0.1": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" + integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/centroid@^6.0.2": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" + integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/helpers@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== + +"@turf/meta@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" + integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== + dependencies: + "@turf/helpers" "^6.5.0" + +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/cookie@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.8": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.0.tgz#afd0519223c29c347087542cbaee2fedc0873b16" + integrity sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "16.11.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" + integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/tabulator-tables@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/tabulator-tables/-/tabulator-tables-5.0.1.tgz#824fef3bef01c38a3bd934016a25e52e1043bf35" + integrity sha512-ieidxy+/bzMCPZsDeSw56DN9ipQ0K4Ts3ZUxPy4yCVExcAsezL4u2UYHBA+BxQ8l7QmEaERT/ctmBqjkRUhh+w== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@ungap/url-search-params@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" + integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" + integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== + +"@webpack-cli/info@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" + integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" + integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +a-big-triangle@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" + integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= + dependencies: + gl-buffer "^2.1.1" + gl-vao "^1.2.0" + weak-map "^1.0.5" + +abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +acorn@^8.4.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + +add-line-numbers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" + integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= + dependencies: + pad-left "^1.0.2" + +affine-hull@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" + integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= + dependencies: + robust-orientation "^1.1.3" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +almost-equal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" + integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= + +alpha-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" + integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= + dependencies: + circumradius "^1.0.0" + delaunay-triangulate "^1.1.6" + +alpha-shape@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" + integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= + dependencies: + alpha-complex "^1.0.0" + simplicial-complex-boundary "^1.0.0" + +angular@>=1.0.6: + version "1.8.2" + resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.2.tgz#5983bbb5a9fa63e213cb7749199e0d352de3a2f1" + integrity sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +array-bounds@^1.0.0, array-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" + integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== + +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-normalize@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" + integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== + dependencies: + array-bounds "^1.0.0" + +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +atob-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" + integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + +autoprefixer@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" + integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== + dependencies: + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-loader@^8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-angularjs-annotate@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz#4213b3aaae494a087aad0b8237c5d0716d22ca76" + integrity sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/types" "^7.2.0" + simple-is "~0.2.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" + integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-transform-define@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz#6a34fd6ea89989feb75721ee4cce817ec779be7f" + integrity sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw== + dependencies: + lodash "^4.17.11" + traverse "0.6.6" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +barycentric@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" + integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= + dependencies: + robust-linear-solve "^1.0.0" + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch-processor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big-rat@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" + integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= + dependencies: + bit-twiddle "^1.0.2" + bn.js "^4.11.6" + double-bits "^1.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" + integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== + +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= + +bit-twiddle@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" + integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= + +bitmap-sdf@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" + integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== + dependencies: + clamp "^1.0.1" + +bl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bn.js@^4.11.6: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +bootstrap@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" + integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== + +boundary-cells@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.2.tgz#ed28c5a2eb36500413e5714f8eec862ad8ffec14" + integrity sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w== + +box-intersect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" + integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== + dependencies: + bit-twiddle "^1.0.2" + typedarray-pool "^1.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + dependencies: + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +buble@^0.19.3: + version "0.19.8" + resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" + integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.3" + minimist "^1.2.0" + os-homedir "^2.0.0" + regexpu-core "^4.5.4" + +bubleify@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.1.tgz#c11fa33fa59d5b9b747d4e486f43889084257f37" + integrity sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ== + dependencies: + buble "^0.19.3" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +caniuse-lite@^1.0.30000655, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280: + version "1.0.30001283" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" + integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== + +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= + dependencies: + element-size "^1.1.1" + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +cdt2d@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" + integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= + dependencies: + binary-search-bounds "^2.0.3" + robust-in-sphere "^1.1.3" + robust-orientation "^1.1.3" + +cell-orientation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" + integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@3.5.2, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +circumcenter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" + integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= + dependencies: + dup "^1.0.0" + robust-linear-solve "^1.0.0" + +circumradius@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" + integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= + dependencies: + circumcenter "^1.0.0" + +clamp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" + integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= + +classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" + integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== + dependencies: + source-map "~0.6.0" + +clean-pslg@^1.1.0, clean-pslg@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" + integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= + dependencies: + big-rat "^1.0.3" + box-intersect "^1.0.1" + nextafter "^1.0.0" + rat-vec "^1.1.1" + robust-segment-intersect "^1.0.1" + union-find "^1.0.2" + uniq "^1.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +color-alpha@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" + integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== + dependencies: + color-parse "^1.4.1" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-id@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" + integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== + dependencies: + clamp "^1.0.1" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-normalize@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" + integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== + dependencies: + color-rgba "^2.2.0" + dtype "^2.0.0" + +color-parse@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" + integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== + dependencies: + color-name "^1.0.0" + +color-rgba@^2.1.1, color-rgba@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.3.0.tgz#d5eb481d7933d2542d1f222ea10ad40d159e9d35" + integrity sha512-z/5fMOY8/IzrBHPBk+n3ATNSM/1atXcHCRPTGPLlzYJ4fn7CRD46zzt3lkLtQ44cL8UIUU4JBXDVrhWj1khiwg== + dependencies: + color-parse "^1.4.1" + color-space "^1.14.6" + +color-space@^1.14.6: + version "1.16.0" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" + integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== + dependencies: + hsluv "^0.0.3" + mumath "^3.3.4" + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colormap@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.2.tgz#4422c1178ce563806e265b96782737be85815abf" + integrity sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA== + dependencies: + lerp "^1.0.3" + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combokeys@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.1.tgz#fc8ca5c3f5f2d2b03a458544cb88b14ab5f53f86" + integrity sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw== + +commander@2, commander@^2.15.1, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-angle@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" + integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= + dependencies: + robust-orientation "^1.0.2" + robust-product "^1.0.0" + robust-sum "^1.0.0" + signum "^0.0.0" + two-sum "^1.0.0" + +compare-cell@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" + integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= + +compare-oriented-cell@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" + integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + +compile-code-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compile-code-loader/-/compile-code-loader-1.0.0.tgz#492002e69e0ce91dff42bec420bbaf575f4c9c4a" + integrity sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw== + dependencies: + loader-utils "^2.0.0" + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-dims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" + integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== + dependencies: + utils-copy "^1.0.0" + validate.io-array "^1.0.6" + validate.io-matrix-like "^1.0.2" + validate.io-ndarray-like "^1.0.0" + validate.io-positive-integer "^1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +conic-gradient@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/conic-gradient/-/conic-gradient-1.0.0.tgz#0bd7aaddeaa14aa5a7c08b22a6ee90613f610479" + integrity sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw== + dependencies: + prefixfree "^1.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +"consolidated-events@^1.1.0 || ^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" + integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== + +const-max-uint32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" + integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= + +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convex-hull@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" + integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= + dependencies: + affine-hull "^1.0.0" + incremental-convex-hull "^1.0.1" + monotone-convex-hull-2d "^1.0.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.2.tgz#18066a3404a302433cb0aa8be82dd3d75c76e5c4" + integrity sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ== + dependencies: + browserslist "^4.18.1" + semver "7.0.0" + +core-js@3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" + integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +country-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" + integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-blank-pseudo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz#10667f9c5f91e4fbde76c4efac55e8eaa6ed9967" + integrity sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA== + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= + +css-has-pseudo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz#43ae03a990cf3d9e7356837c6b500e04037606b5" + integrity sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA== + dependencies: + postcss-selector-parser "^6" + +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + +css-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-loader@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.3.0.tgz#334d3500ff0a0c14cfbd4b0670088dbb5b5c1530" + integrity sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + semver "^7.3.5" + +css-loader@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" + integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + semver "^7.3.5" + +css-prefers-color-scheme@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz#a89bc1abfe946e77a1a1e12dbc25a1439705933f" + integrity sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA== + +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + +cssdb@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.0.0.tgz#96db23e70dda3d03a32346de611f0e79fee68b7f" + integrity sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.10, csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + +cubic-hermite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" + integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + +d3-array@1, d3-array@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1, d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +d3-force@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +d3@^3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +date-fns@^2.27.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-equal@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" + integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== + dependencies: + call-bind "^1.0.0" + es-get-iterator "^1.1.1" + get-intrinsic "^1.0.1" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.1.1" + isarray "^2.0.5" + object-is "^1.1.4" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-gateway@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delaunay-triangulate@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" + integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= + dependencies: + incremental-convex-hull "^1.0.1" + uniq "^1.0.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-helpers@^5.1.3: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.0, domhandler@^4.2.0, domhandler@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +double-bits@^1.1.0, double-bits@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" + integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= + +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.5: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +earcut@^2.1.5, earcut@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" + integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== + +edges-to-adjacency-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" + integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= + dependencies: + uniq "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.896: + version "1.4.5" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz#912e8fd1645edee2f0f212558f40916eb538b1f9" + integrity sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw== + +element-resize-detector@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== + dependencies: + batch-processor "1.0.0" + +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= + +elementary-circuits-directed-graph@^1.0.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" + integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== + dependencies: + strongly-connected-components "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" + integrity sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA== + dependencies: + base64-arraybuffer "0.1.4" + +engine.io@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" + integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + +enhanced-resolve@^3.1.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.5: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-get-iterator@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3, es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-react-hooks@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-frustum-planes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" + integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= + +extricate-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extricate-loader/-/extricate-loader-3.0.0.tgz#7a9998e885046d5d6991d62d4887ee113ca1e0bd" + integrity sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg== + dependencies: + loader-utils "^1.1.0" + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-isnumeric@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" + integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== + dependencies: + is-string-blank "^1.0.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastdom@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.10.tgz#4f2c7c9b24e7e249fc70c63131842b859b92bf09" + integrity sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A== + dependencies: + strictdom "^1.0.1" + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-saver@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a" + integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filtered-vector@^1.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.5.tgz#5a831278c159721dd3be34ef017842836ef3d461" + integrity sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw== + dependencies: + binary-search-bounds "^2.0.0" + cubic-hermite "^1.0.0" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== + dependencies: + dtype "^2.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flip-pixels@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" + integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== + +focus-trap@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" + integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== + dependencies: + tabbable "^5.2.1" + +focus-visible@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" + integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== + +follow-redirects@^1.0.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== + dependencies: + css-font "^1.0.0" + +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== + dependencies: + css-font "^1.2.0" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gamma@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" + integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-canvas-context@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" + integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= + +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +gl-axes3d@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" + integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== + dependencies: + bit-twiddle "^1.0.2" + dup "^1.0.0" + extract-frustum-planes "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-state "^1.0.0" + gl-vao "^1.3.0" + gl-vec4 "^1.0.1" + glslify "^7.0.0" + robust-orientation "^1.1.3" + split-polygon "^1.0.0" + vectorize-text "^3.2.1" + +gl-buffer@^2.1.1, gl-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" + integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.1.0" + typedarray-pool "^1.0.0" + +gl-cone3d@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" + integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== + dependencies: + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + gl-vec3 "^1.1.3" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" + integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= + +gl-contour2d@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.7.tgz#ca330cf8449673a9ca0b3f6726c83f8d35c7a50c" + integrity sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw== + dependencies: + binary-search-bounds "^2.0.4" + cdt2d "^1.0.0" + clean-pslg "^1.1.2" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + ndarray "^1.0.18" + surface-nets "^1.0.2" + +gl-error3d@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" + integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + +gl-fbo@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" + integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= + dependencies: + gl-texture2d "^2.0.0" + +gl-format-compiler-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" + integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= + dependencies: + add-line-numbers "^1.0.1" + gl-constants "^1.0.0" + glsl-shader-name "^1.0.0" + sprintf-js "^1.0.3" + +gl-heatmap2d@^1.0.6: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz#dbbb2c288bfe277002fa50985155b0403d87640f" + integrity sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + typedarray-pool "^1.2.0" + +gl-line3d@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" + integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-mat3@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" + integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= + +gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== + +gl-matrix@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +gl-mesh3d@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" + integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== + dependencies: + barycentric "^1.0.1" + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + normals "^1.1.0" + polytope-closest-point "^1.0.0" + simplicial-complex-contour "^1.0.2" + typedarray-pool "^1.1.0" + +gl-plot2d@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" + integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + glsl-inverse "^1.0.0" + glslify "^7.0.0" + text-cache "^4.2.2" + +gl-plot3d@^2.4.6: + version "2.4.7" + resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.7.tgz#b66e18c5affdd664f42c884acf7b82c60b41ee78" + integrity sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg== + dependencies: + "3d-view" "^2.0.0" + a-big-triangle "^1.0.3" + gl-axes3d "^1.5.3" + gl-fbo "^2.0.5" + gl-mat4 "^1.2.0" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + gl-spikes3d "^1.0.10" + glslify "^7.0.0" + has-passive-events "^1.0.0" + is-mobile "^2.2.1" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + right-now "^1.0.0" + +gl-pointcloud2d@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" + integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + typedarray-pool "^1.1.0" + +gl-quat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" + integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= + dependencies: + gl-mat3 "^1.0.0" + gl-vec3 "^1.0.3" + gl-vec4 "^1.0.0" + +gl-scatter3d@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" + integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== + dependencies: + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + is-string-blank "^1.0.1" + typedarray-pool "^1.1.0" + vectorize-text "^3.2.1" + +gl-select-box@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" + integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + +gl-select-static@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" + integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== + dependencies: + bit-twiddle "^1.0.2" + gl-fbo "^2.0.5" + ndarray "^1.0.18" + typedarray-pool "^1.1.0" + +gl-shader@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.3.1.tgz#56094cf3c06e802ac6c286b3b2166abce901d882" + integrity sha512-xLoN6XtRLlg97SEqtuzfKc+pVWpVkQ3YjDI1kuCale8tF7+zMhiKlMfmG4IMQPMdKJZQbIc/Ny8ZusEpfh5U+w== + dependencies: + gl-format-compiler-error "^1.0.2" + weakmap-shim "^1.1.0" + +gl-spikes2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" + integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== + +gl-spikes3d@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" + integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glslify "^7.0.0" + +gl-state@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" + integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= + dependencies: + uniq "^1.0.0" + +gl-streamtube3d@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" + integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== + dependencies: + gl-cone3d "^1.5.2" + gl-vec3 "^1.1.3" + gl-vec4 "^1.0.1" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + +gl-surface3d@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.6.0.tgz#5fc915759a91e9962dcfbf3982296c462a032526" + integrity sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A== + dependencies: + binary-search-bounds "^2.0.4" + bit-twiddle "^1.0.2" + colormap "^2.3.1" + dup "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-beckmann "^1.1.2" + glslify "^7.0.0" + ndarray "^1.0.18" + ndarray-gradient "^1.0.0" + ndarray-ops "^1.2.2" + ndarray-pack "^1.2.1" + ndarray-scratch "^1.2.0" + surface-nets "^1.0.2" + typedarray-pool "^1.1.0" + +gl-text@^1.1.8: + version "1.3.1" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" + integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.5.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.1.2" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^2.0.0" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" + integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.2.2" + typedarray-pool "^1.1.0" + +gl-util@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" + integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + +gl-vao@^1.2.0, gl-vao@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" + integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= + +gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" + integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== + +gl-vec4@^1.0.0, gl-vec4@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" + integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-inverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" + integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= + +glsl-out-of-range@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" + integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-shader-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" + integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= + dependencies: + atob-lite "^1.0.0" + glsl-tokenizer "^2.0.2" + +glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" + integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= + +glsl-specular-cook-torrance@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" + integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= + dependencies: + glsl-specular-beckmann "^1.1.1" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" + integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.2" + resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" + integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== + dependencies: + "@choojs/findup" "^0.2.0" + events "^3.2.0" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" + integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== + dependencies: + bl "^2.2.1" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.5" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.5" + through2 "^2.0.1" + xtend "^4.0.0" + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= + dependencies: + is-browser "^2.0.1" + +has-passive-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" + integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== + dependencies: + is-browser "^2.0.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0, he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +highlight.js@^10.7.2: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hoist-non-react-statics@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsluv@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" + integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-3.0.1.tgz#84d9094d7fc2e3fcd871d1524736953742758585" + integrity sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA== + dependencies: + html-minifier-terser "^6.0.2" + parse5 "^6.0.1" + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-to-react@^1.3.4: + version "1.4.7" + resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.7.tgz#a58129c1b77c6d4e047a647372bd194e25420b89" + integrity sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g== + dependencies: + domhandler "^4.0" + htmlparser2 "^7.0" + lodash.camelcase "^4.3.0" + ramda "^0.27.1" + +htmlparser2@^7.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.12: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +image-palette@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" + integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== + dependencies: + color-id "^1.1.0" + pxls "^2.0.0" + quantize "^1.0.2" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" + integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +incremental-convex-hull@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" + integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= + dependencies: + robust-orientation "^1.1.2" + simplicial-complex "^1.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inline-style-prefixer@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz#c5c0e43ba8831707afc5f5bbfd97edf45c1fa7ae" + integrity sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ== + dependencies: + css-in-js-utils "^2.0.0" + +internal-ip@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" + integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== + dependencies: + default-gateway "^6.0.0" + ipaddr.js "^1.9.1" + is-ip "^3.1.0" + p-event "^4.2.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpolate-loader@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/interpolate-loader/-/interpolate-loader-2.0.1.tgz#bdf0092a3d4732842ac29c20bd03f1fb34891705" + integrity sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA== + dependencies: + escape-string-regexp "^2.0.0" + loader-utils "^1.1.0" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +interval-tree-1d@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz#b44f657de7ddae69ea3f98e0a9ad4bb046b07d11" + integrity sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ== + dependencies: + binary-search-bounds "^2.0.0" + +invert-permutation@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" + integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= + +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4, is-arguments@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-base64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" + integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-blob@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-browser@^2.0.1, is-browser@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== + +is-buffer@^1.0.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0, is-buffer@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= + +is-float-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" + integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-mobile@^2.2.1, is-mobile@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" + integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" + integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.1, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-weakset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" + integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@^2.0.1, isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.0.6: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.0.tgz#fa10dddc611cbb47a4153543dd16a0c7e7fd745c" + integrity sha512-4WuKcUxtzxBoKOUFbt1MtTY9fJwPVD4aN/4Cgxee7OLetPZn5as2bjfZz98XSf2Zq1JFfhqPZpS+43BmWXKgCA== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jquery@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +just-debounce-it@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/just-debounce-it/-/just-debounce-it-3.0.1.tgz#8c8a4c9327c9523366ec79ac9a959a938153bd2f" + integrity sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg== + +karma-chrome-launcher@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" + integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.3.0" + mime "^2.5.2" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^3.1.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.28" + yargs "^16.1.1" + +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +lerp@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" + integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.1.0, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= + dependencies: + once "~1.3.0" + +mapbox-gl@1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" + integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +marching-simplex-table@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" + integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= + dependencies: + convex-hull "^1.0.3" + +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + +mat4-decompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" + integrity sha1-ZetP451wh496RE60Yk1S9+frL68= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + +mat4-interpolate@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" + integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + mat4-decompose "^1.0.3" + mat4-recompose "^1.0.3" + quat-slerp "^1.0.0" + +mat4-recompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" + integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= + dependencies: + gl-mat4 "^1.0.1" + +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= + +matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz#d316ae5e99fe801610c1d7842ab54566d4c62411" + integrity sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA== + dependencies: + binary-search-bounds "^2.0.0" + gl-mat4 "^1.1.2" + gl-vec3 "^1.0.3" + mat4-interpolate "^1.0.3" + +mdast-add-list-metadata@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" + integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== + dependencies: + unist-util-visit-parents "1.1.2" + +mdast-util-find-and-replace@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" + integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== + dependencies: + escape-string-regexp "^4.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-gfm-autolink-literal@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" + integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== + dependencies: + ccount "^1.0.0" + mdast-util-find-and-replace "^1.1.0" + micromark "^2.11.3" + +mdast-util-gfm-strikethrough@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" + integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== + dependencies: + mdast-util-to-markdown "^0.6.0" + +mdast-util-gfm-table@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" + integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== + dependencies: + markdown-table "^2.0.0" + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm-task-list-item@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" + integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== + dependencies: + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" + integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== + dependencies: + mdast-util-gfm-autolink-literal "^0.1.0" + mdast-util-gfm-strikethrough "^0.2.0" + mdast-util-gfm-table "^0.1.0" + mdast-util-gfm-task-list-item "^0.1.0" + mdast-util-to-markdown "^0.6.1" + +mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.2.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" + integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== + dependencies: + fs-monkey "1.0.3" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +memory-fs@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromark-extension-gfm-autolink-literal@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" + integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== + dependencies: + micromark "~2.11.3" + +micromark-extension-gfm-strikethrough@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" + integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-table@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" + integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-tagfilter@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" + integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== + +micromark-extension-gfm-task-list-item@~0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" + integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" + integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== + dependencies: + micromark "~2.11.0" + micromark-extension-gfm-autolink-literal "~0.5.0" + micromark-extension-gfm-strikethrough "~0.6.5" + micromark-extension-gfm-table "~0.4.0" + micromark-extension-gfm-tagfilter "~0.3.0" + micromark-extension-gfm-task-list-item "~0.3.0" + +micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.2.tgz#93f53175b0f0dc4014bd2d612218fccfcf3534d3" + integrity sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.2" + debug "4.3.2" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.25" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +monotone-convex-hull-2d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" + integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= + dependencies: + robust-orientation "^1.1.3" + +mouse-change@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" + integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= + dependencies: + mouse-event "^1.0.0" + +mouse-event-offset@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" + integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= + +mouse-event@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" + integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= + +mouse-wheel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" + integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= + dependencies: + right-now "^1.0.0" + signum "^1.0.0" + to-px "^1.0.1" + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mumath@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" + integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= + dependencies: + almost-equal "^1.1.0" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + +nanoid@3.1.25: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +ndarray-extract-contour@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" + integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= + dependencies: + typedarray-pool "^1.0.0" + +ndarray-gradient@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.1.tgz#16126a78ac241162248224aa662b6db6a5885402" + integrity sha512-+xONVi7xxTCGL6KOb11Yyoe0tPNqAUKF39CvFoRjL5pdOmPd2G2pckK9lD5bpLF3q45LLnYNyiUSJSdNmQ2MTg== + dependencies: + cwise-compiler "^1.0.0" + dup "^1.0.0" + +ndarray-linear-interpolate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" + integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= + +ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" + integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + dependencies: + cwise-compiler "^1.0.0" + +ndarray-pack@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +ndarray-scratch@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" + integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= + dependencies: + ndarray "^1.0.14" + ndarray-ops "^1.2.1" + typedarray-pool "^1.0.2" + +ndarray-sort@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" + integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= + dependencies: + typedarray-pool "^1.0.0" + +ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" + integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nextafter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" + integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= + dependencies: + double-bits "^1.1.0" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-svg-path@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" + integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= + +normals@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" + integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= + dependencies: + is-finite "^1.0.1" + +numeric@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" + integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1, object-is@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +orbit-camera-controller@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" + integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.3" + +os-homedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" + integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== + +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pad-left@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" + integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= + dependencies: + repeat-string "^1.3.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parenthesis@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.8.tgz#3457fccb8f05db27572b841dad9d2630b912f125" + integrity sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw== + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= + +parse-unit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" + integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +permutation-parity@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" + integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= + dependencies: + typedarray-pool "^1.0.0" + +permutation-rank@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" + integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= + dependencies: + invert-permutation "^1.0.0" + typedarray-pool "^1.0.0" + +pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +planar-dual@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" + integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= + dependencies: + compare-angle "^1.0.0" + dup "^1.0.0" + +planar-graph-to-polyline@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz#ed300620c33001ee2cca0ac6d1dae8d02d23f009" + integrity sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA== + dependencies: + edges-to-adjacency-list "^1.0.0" + planar-dual "^1.0.0" + point-in-big-polygon "^2.0.1" + robust-orientation "^1.0.1" + robust-sum "^1.0.0" + two-product "^1.0.0" + uniq "^1.0.0" + +plotly.js@1.54.6: + version "1.54.6" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.54.6.tgz#ed021aa8da85759c69602c97bd3dab2b09eeec22" + integrity sha512-z6FDeo/O4iNN+TfKJvk3Sv+MS7prFfM6oLJK5q9TYpwIQEz8oOtxwKQJospqtKub6mvxOhPoDIxxmpDZeiNopQ== + dependencies: + "@plotly/d3-sankey" "0.7.2" + "@plotly/d3-sankey-circular" "0.33.1" + "@turf/area" "^6.0.1" + "@turf/bbox" "^6.0.1" + "@turf/centroid" "^6.0.2" + alpha-shape "^1.0.0" + canvas-fit "^1.5.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + convex-hull "^1.0.3" + country-regex "^1.1.0" + d3 "^3.5.17" + d3-force "^1.2.1" + d3-hierarchy "^1.1.9" + d3-interpolate "^1.4.0" + delaunay-triangulate "^1.1.6" + es6-promise "^4.2.8" + fast-isnumeric "^1.1.4" + gl-cone3d "^1.5.2" + gl-contour2d "^1.1.7" + gl-error3d "^1.0.16" + gl-heatmap2d "^1.0.6" + gl-line3d "1.2.1" + gl-mat4 "^1.2.0" + gl-mesh3d "^2.3.1" + gl-plot2d "^1.4.5" + gl-plot3d "^2.4.6" + gl-pointcloud2d "^1.0.3" + gl-scatter3d "^1.2.3" + gl-select-box "^1.0.4" + gl-spikes2d "^1.0.2" + gl-streamtube3d "^1.4.1" + gl-surface3d "^1.5.2" + gl-text "^1.1.8" + glslify "^7.0.0" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + is-mobile "^2.2.2" + mapbox-gl "1.10.1" + matrix-camera-controller "^2.1.3" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + ndarray-linear-interpolate "^1.0.0" + parse-svg-path "^0.1.2" + point-cluster "^3.1.8" + polybooljs "^1.2.0" + regl "^1.6.1" + regl-error2d "^2.0.8" + regl-line2d "^3.0.15" + regl-scatter2d "^3.1.8" + regl-splom "^1.0.8" + right-now "^1.0.0" + robust-orientation "^1.1.3" + sane-topojson "^4.0.0" + strongly-connected-components "^1.0.1" + superscript-text "^1.0.0" + svg-path-sdf "^1.1.3" + tinycolor2 "^1.4.1" + to-px "1.0.1" + topojson-client "^3.1.0" + webgl-context "^2.2.0" + world-calendars "^1.0.3" + +point-cluster@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.8.tgz#a63625fd8964f2a5b446025a1acf8bcac42500c0" + integrity sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ== + dependencies: + array-bounds "^1.0.1" + array-normalize "^1.1.4" + binary-search-bounds "^2.0.4" + bubleify "^1.1.0" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + +point-in-big-polygon@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz#69d293010cead58af08c3082ad1d23f600ef10af" + integrity sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q== + dependencies: + binary-search-bounds "^2.0.0" + interval-tree-1d "^1.0.1" + robust-orientation "^1.1.3" + slab-decomposition "^1.0.1" + +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= + +polytope-closest-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" + integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= + dependencies: + numeric "^1.2.6" + +popper.js@1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +postcss-attribute-case-insensitive@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" + integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== + dependencies: + postcss-selector-parser "^6.0.2" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz#2fd769959e7fe658b4c0e7d40b0ab245fc8664f1" + integrity sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w== + dependencies: + postcss-values-parser "6.0.1" + +postcss-color-hex-alpha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz#84bfd985a93b0a18e047ebcb5fd463e2cae5e7a6" + integrity sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw== + dependencies: + postcss-values-parser "^6.0.0" + +postcss-color-rebeccapurple@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz#980fbd98eb68ebbb38be02a82c7554e043c8fdf4" + integrity sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA== + dependencies: + postcss-values-parser "^6" + +postcss-custom-media@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" + integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== + +postcss-custom-properties@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz#fd01ec9bd1462336ea8af7ba3c1a2c47c203031e" + integrity sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ== + dependencies: + postcss-values-parser "^6" + +postcss-custom-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" + integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz#7026a070a4849072a232eaf0cdd960de3013658d" + integrity sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA== + dependencies: + postcss-selector-parser "6.0.6" + +postcss-double-position-gradients@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz#3c21ad52b6f13d81caf2563b0010a2c5872272af" + integrity sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw== + dependencies: + postcss-values-parser "6.0.1" + +postcss-env-function@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.2.tgz#5509d008ff0f069fa18bd2eace4f3fdb18150c28" + integrity sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg== + dependencies: + postcss-values-parser "6.0.1" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz#b12a859616eca7152976fec24ef337ab29bbc405" + integrity sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q== + +postcss-focus-within@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz#615659122325d86e00bc8ed84ab6129d0b3a0f62" + integrity sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg== + +postcss-font-family-system-ui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz#cceb13dccb11019e9d6246db9a93137a30a53e21" + integrity sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.30000655" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz#8941c400df902247603fd915c7dc81e1d7686b15" + integrity sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og== + +postcss-image-set-function@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz#95b64db01b8812fcbece3bb36a3f2b8133bf7c91" + integrity sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A== + dependencies: + postcss-values-parser "6.0.1" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-lab-function@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz#b6a1fb1032ddd7f4f7198ca78ec84c9b5bc7d80e" + integrity sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w== + dependencies: + "@csstools/convert-colors" "2.0.0" + postcss-values-parser "6.0.1" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.0.tgz#f646ef6a3562890e1123a32e695d14cc271afb21" + integrity sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values-replace@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz#259192a73a291888816edb93934dd7177fb877ac" + integrity sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw== + dependencies: + enhanced-resolve "^3.1.0" + es6-promisify "^5.0.0" + icss-utils "^4.0.0" + loader-utils "^2.0.0" + postcss "^7.0.0" + postcss-values-parser "^1.3.1" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.0.2.tgz#0cf9e81712fe7b6c3005e7d884cce2cb0a06326e" + integrity sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA== + dependencies: + postcss-selector-parser "6.0.6" + +postcss-overflow-shorthand@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz#f57631672333b302ffdcfc0735b8b7d0244c2a25" + integrity sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw== + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.1.tgz#9fbd18b3d1d438d313b2a29f5a50424c8ebca28d" + integrity sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ== + dependencies: + postcss-values-parser "6.0.1" + +postcss-preset-env@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz#7f1fc5ac38e60a8e5ff9a920396d936a830e6120" + integrity sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA== + dependencies: + autoprefixer "^10.4.0" + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + css-blank-pseudo "^2.0.0" + css-has-pseudo "^2.0.0" + css-prefers-color-scheme "^5.0.0" + cssdb "^5.0.0" + postcss "^8.3" + postcss-attribute-case-insensitive "^5.0.0" + postcss-color-functional-notation "^4.0.1" + postcss-color-hex-alpha "^8.0.0" + postcss-color-rebeccapurple "^7.0.0" + postcss-custom-media "^8.0.0" + postcss-custom-properties "^12.0.0" + postcss-custom-selectors "^6.0.0" + postcss-dir-pseudo-class "^6.0.0" + postcss-double-position-gradients "^3.0.1" + postcss-env-function "^4.0.2" + postcss-focus-visible "^6.0.1" + postcss-focus-within "^5.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.0" + postcss-image-set-function "^4.0.2" + postcss-initial "^4.0.1" + postcss-lab-function "^4.0.1" + postcss-logical "^5.0.0" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.0.2" + postcss-overflow-shorthand "^3.0.0" + postcss-page-break "^3.0.4" + postcss-place "^7.0.1" + postcss-pseudo-class-any-link "^7.0.0" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^5.0.0" + +postcss-pseudo-class-any-link@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz#b06483c8a241cee1e420f9ebd08680d4f95b2b20" + integrity sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ== + dependencies: + postcss-selector-parser "^6" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== + dependencies: + balanced-match "^1.0.0" + +postcss-selector-parser@6.0.6, postcss-selector-parser@^6, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-values-parser@6.0.1, postcss-values-parser@^6, postcss-values-parser@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz#aeb5e4522c4aabeb1ebbb14122194b9c08069675" + integrity sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + +postcss-values-parser@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" + integrity sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.14: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.15, postcss@^8.3: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +postcss@^8.4.4: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + +prefixfree@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prefixfree/-/prefixfree-1.0.0.tgz#82b0edbbac107f2a3e2dc569d6c3df4035cd7910" + integrity sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prop-types@^15.0.0, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pxls@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" + integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== + dependencies: + arr-flatten "^1.1.0" + compute-dims "^1.1.0" + flip-pixels "^1.0.2" + is-browser "^2.1.0" + is-buffer "^2.0.3" + to-uint8 "^1.4.1" + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +quantize@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" + integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= + +quat-slerp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" + integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= + dependencies: + gl-quat "^1.0.0" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" + integrity sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs= + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rat-vec@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" + integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= + dependencies: + big-rat "^1.0.3" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-file-drop@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/react-file-drop/-/react-file-drop-3.0.6.tgz#7fb75bdc0e9a10be4f6c653d2a906cacdd460d3e" + integrity sha512-OXfSpA8YY/OsKNITXPAOr+Rar8izqNZkx/N7B5vkp00AhQOFvj8ctC4bWInq1Mzpm4De5+XfpXAYbj4D4ze1QA== + dependencies: + prop-types "^15.7.2" + +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-markdown@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac" + integrity sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w== + dependencies: + "@types/mdast" "^3.0.3" + "@types/unist" "^2.0.3" + html-to-react "^1.3.4" + mdast-add-list-metadata "1.0.1" + prop-types "^15.7.2" + react-is "^16.8.6" + remark-parse "^9.0.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + xtend "^4.0.1" + +react-movable@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/react-movable/-/react-movable-3.0.2.tgz#45e6bd95db9f8340a114ddc8860dc9994719e94a" + integrity sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA== + +react-virtualized@^9.22.3: + version "9.22.3" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" + integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== + dependencies: + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + +react-waypoint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/react-waypoint/-/react-waypoint-10.1.0.tgz#6ab522a61bd52946260e4a78b3182759a97b40ec" + integrity sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q== + dependencies: + "@babel/runtime" "^7.12.5" + consolidated-events "^1.1.0 || ^2.0.0" + prop-types "^15.0.0" + react-is "^17.0.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +reduce-simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" + integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + compare-oriented-cell "^1.0.1" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" + integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.5.4, regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +regl-error2d@^2.0.8: + version "2.0.12" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" + integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== + dependencies: + array-bounds "^1.0.1" + color-normalize "^1.5.0" + flatten-vertex-data "^1.0.2" + object-assign "^4.1.1" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-line2d@^3.0.15: + version "3.1.2" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" + integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== + dependencies: + array-bounds "^1.0.1" + array-find-index "^1.0.2" + array-normalize "^1.1.4" + color-normalize "^1.5.0" + earcut "^2.1.5" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + +regl-scatter2d@^3.1.8, regl-scatter2d@^3.2.3: + version "3.2.8" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz#a1360e803e3fdf628ca09a72a435a0b7d4cf5675" + integrity sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig== + dependencies: + "@plotly/point-cluster" "^3.1.9" + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + image-palette "^2.1.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-splom@^1.0.8: + version "1.0.14" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" + integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + color-alpha "^1.0.4" + flatten-vertex-data "^1.0.2" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + raf "^3.4.1" + regl-scatter2d "^3.2.3" + +regl@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3" + integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w== + +regl@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" + integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-breaks@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.2.tgz#f466b9d3474d7323146c0149fc1496dabadd908e" + integrity sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw== + dependencies: + "@types/mdast" "^3.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + +remark-gfm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" + integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== + dependencies: + mdast-util-gfm "^0.1.0" + micromark-extension-gfm "^0.3.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +repeat-string@^1.0.0, repeat-string@^1.3.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= + +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.14.2, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +right-now@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +robust-compress@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" + integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= + +robust-determinant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" + integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= + dependencies: + robust-compress "^1.0.0" + robust-scale "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-dot-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" + integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= + dependencies: + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-in-sphere@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.2.1.tgz#ece3c2ae0fdf36b351680566adea7e93c6ba46da" + integrity sha512-3zJdcMIOP1gdwux93MKTS0RiMYEGwQBoE5R1IW/9ZQmGeZzP7f7i4+xdcK8ujJvF/dEOS1WPuI9IB1WNFbj3Cg== + dependencies: + robust-scale "^1.0.0" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-linear-solve@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" + integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= + dependencies: + robust-determinant "^1.1.0" + +robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.2.1.tgz#f6c2b00a5df5f1cb9597be63a45190f273899361" + integrity sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg== + dependencies: + robust-scale "^1.0.2" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.2" + +robust-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" + integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= + dependencies: + robust-scale "^1.0.0" + robust-sum "^1.0.0" + +robust-scale@^1.0.0, robust-scale@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" + integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= + dependencies: + two-product "^1.0.2" + two-sum "^1.0.0" + +robust-segment-intersect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" + integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= + dependencies: + robust-orientation "^1.1.3" + +robust-subtract@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" + integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= + +robust-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" + integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane-topojson@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/sane-topojson/-/sane-topojson-4.0.0.tgz#624cdb26fc6d9392c806897bfd1a393f29bb5308" + integrity sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +scrollbar-width@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/scrollbar-width/-/scrollbar-width-3.1.1.tgz#c62e63efa5934dac37b43da34f7550caca8444a2" + integrity sha1-xi5j76WTTaw3tD2jT3VQysqERKI= + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.3, side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +signum@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" + integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= + +signum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" + integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= + +simple-is@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" + integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= + +simplicial-complex-boundary@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" + integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= + dependencies: + boundary-cells "^2.0.0" + reduce-simplicial-complex "^1.0.0" + +simplicial-complex-contour@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" + integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= + dependencies: + marching-simplex-table "^1.0.0" + ndarray "^1.0.15" + ndarray-sort "^1.0.0" + typedarray-pool "^1.1.0" + +simplicial-complex@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" + integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= + dependencies: + bit-twiddle "~0.0.1" + union-find "~0.0.3" + +simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" + integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= + dependencies: + bit-twiddle "^1.0.0" + union-find "^1.0.0" + +simplify-planar-graph@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" + integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= + dependencies: + robust-orientation "^1.0.1" + simplicial-complex "^0.3.3" + +simply-uuid@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simply-uuid/-/simply-uuid-1.0.1.tgz#539241d81528969cef23892faf4588005fa99ab8" + integrity sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg= + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +slab-decomposition@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.3.tgz#0345b3d364d78dad3f400cd5c8e0424547d23e7c" + integrity sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ== + dependencies: + binary-search-bounds "^2.0.0" + functional-red-black-tree "^1.0.0" + robust-orientation "^1.1.3" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sniffr@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/sniffr/-/sniffr-1.2.0.tgz#d4e31073ef4f7c00d87dba89289736fba25cadb4" + integrity sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ== + +socket.io-adapter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" + integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== + +socket.io-parser@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" + integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~4.1.0" + socket.io-adapter "~2.1.0" + socket.io-parser "~4.0.3" + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +source-map-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" + integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + source-map-js "^0.6.2" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-polygon@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" + integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= + dependencies: + robust-dot-product "^1.0.0" + robust-sum "^1.0.0" + +sprintf-js@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +strictdom@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" + integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= + +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== + dependencies: + parenthesis "^3.1.5" + +string-to-arraybuffer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" + integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== + dependencies: + atob-lite "^2.0.0" + is-base64 "^0.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strongly-connected-components@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" + integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= + +style-inject@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" + integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== + +style-loader@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.0.tgz#d66ea95fc50b22f8b79b69a9e414760fcf58d8d8" + integrity sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ== + +style-loader@~3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +styled-components@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" + integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +supercluster@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" + integrity sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g== + dependencies: + kdbush "^3.0.0" + +superscript-text@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" + integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +surface-nets@^1.0.0, surface-nets@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" + integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= + dependencies: + ndarray-extract-contour "^1.0.0" + triangulate-hypercube "^1.0.0" + zero-crossings "^1.0.0" + +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + +svg-path-bounds@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" + integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + +tabbable@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" + integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== + +tabulator-tables@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/tabulator-tables/-/tabulator-tables-5.0.1.tgz#c077de5da11ddca654a3132e908e80ff5f5382e2" + integrity sha512-zSPYzkLIBGwmAFEPOgUpXXNKzO95bVj6EKRikS0Em32gnfhSR9n73mN5TpQV1jU4nPv/pUUTbMZVVHrjzIaaJQ== + +tapable@^0.2.7: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" + integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.2.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" + integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== + dependencies: + jest-worker "^27.0.6" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-cache@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" + integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== + dependencies: + vectorize-text "^3.2.1" + +three-csg-ts@3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/three-csg-ts/-/three-csg-ts-3.1.9.tgz#1438de3b6747b9b55deb88d9e0acdc6e47681979" + integrity sha512-Qke0+07AKDfeiRjh46sOF2iiilSMcKnfgHjuArdMB4poZs3X0FQLHGFIEBbGrv3ejrkHASW9o5pLRfFFQhk9hg== + +three@0.130.1: + version "0.130.1" + resolved "https://registry.yarnpkg.com/three/-/three-0.130.1.tgz#797588b2877ace31603bbbc864eb2e3022f0b3b4" + integrity sha512-OSPPKcGvFSiGkG3jFrwwC76PBV/ZSrGxpBbg28bW8s9GU8r/y2spNGtEXHEb/CVqo0Ctf5Lx2rVaxQZB6OasaA== + +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tinycolor2@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-array-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" + integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== + dependencies: + flatten-vertex-data "^1.0.2" + is-blob "^2.0.1" + string-to-arraybuffer "^1.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-float32@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" + integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== + +to-px@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" + integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= + dependencies: + parse-unit "^1.0.1" + +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-uint8@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" + integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== + dependencies: + arr-flatten "^1.1.0" + clamp "^1.0.1" + is-base64 "^0.1.0" + is-float-array "^1.0.0" + to-array-buffer "^3.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +topojson-client@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" + integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== + dependencies: + commander "2" + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +traverse@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= + +triangulate-hypercube@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" + integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= + dependencies: + gamma "^0.1.0" + permutation-parity "^1.0.0" + permutation-rank "^1.0.0" + +triangulate-polyline@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" + integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= + dependencies: + cdt2d "^1.0.0" + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trough@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" + integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +turntable-camera-controller@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" + integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.2" + gl-vec3 "^1.0.2" + +two-product@^1.0.0, two-product@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" + integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= + +two-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" + integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type-name@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" + integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0, typedarray-pool@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" + integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.28: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.1.tgz#345e349e3ab353ab612878338eb9d57b4dea1d46" + integrity sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-find@^1.0.0, union-find@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" + integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= + +union-find@~0.0.3: + version "0.0.4" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" + integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= + +uniq@^1.0.0, uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" + integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-stringify-position@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" + integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" + integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" + integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" + integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-copy-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" + integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= + dependencies: + object-keys "^1.0.9" + utils-copy "^1.1.0" + +utils-copy@^1.0.0, utils-copy@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" + integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= + dependencies: + const-pinf-float64 "^1.0.0" + object-keys "^1.0.9" + type-name "^2.0.0" + utils-copy-error "^1.0.0" + utils-indexof "^1.0.0" + utils-regex-from-string "^1.0.0" + validate.io-array "^1.0.3" + validate.io-buffer "^1.0.1" + validate.io-nonnegative-integer "^1.0.0" + +utils-indexof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" + integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= + dependencies: + validate.io-array-like "^1.0.1" + validate.io-integer-primitive "^1.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +utils-regex-from-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" + integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= + dependencies: + regex-regex "^1.0.0" + validate.io-string-primitive "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate.io-array-like@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" + integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= + dependencies: + const-max-uint32 "^1.0.2" + validate.io-integer-primitive "^1.0.0" + +validate.io-array@^1.0.3, validate.io-array@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= + +validate.io-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" + integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= + +validate.io-integer-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" + integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= + dependencies: + validate.io-number-primitive "^1.0.0" + +validate.io-integer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= + dependencies: + validate.io-number "^1.0.3" + +validate.io-matrix-like@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" + integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= + +validate.io-ndarray-like@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" + integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= + +validate.io-nonnegative-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" + integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-number-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" + integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= + +validate.io-positive-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" + integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-string-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" + integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vectorize-text@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.2.tgz#3e978889df4ae333975d38669529c942a63e1f65" + integrity sha512-34NVOCpMMQVXujU4vb/c6u98h6djI0jGdtC202H4Huvzn48B6ARsR7cmGh1xsAc0pHNQiUKGK/aHF05VtGv+eA== + dependencies: + cdt2d "^1.0.0" + clean-pslg "^1.1.0" + ndarray "^1.0.11" + planar-graph-to-polyline "^1.0.6" + simplify-planar-graph "^2.0.1" + surface-nets "^1.0.0" + triangulate-polyline "^1.0.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74" + integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vfile@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.0.tgz#a32a646ff9251c274dbe8675644a39031025b369" + integrity sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +vt-pbf@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + +watchpack@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" + integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +weakmap-shim@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" + integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= + +webgl-context@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" + integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= + dependencies: + get-canvas-context "^1.0.1" + +webpack-bundle-analyzer@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.0.tgz#dc43e6e0f80dd52e89cbf73d5294bcd7ad6eb343" + integrity sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.0" + "@webpack-cli/info" "^1.4.0" + "@webpack-cli/serve" "^1.6.0" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" + integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== + dependencies: + colorette "^2.0.10" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.3.1.tgz#759d3337f0fbea297fbd1e433ab04ccfc000076b" + integrity sha512-qNXQCVYo1kYhH9pgLtm8LRNkXX3XzTfHSj/zqzaqYzGPca+Qjr+81wj1jgPMCHhIhso9WEQ+kX9z23iG9PzQ7w== + dependencies: + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.1" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + internal-ip "^6.2.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^3.1.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.2.1" + ws "^8.1.0" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== + +webpack@5.57.1: + version "5.57.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.57.1.tgz#ead5ace2c17ecef2ae8126f143bfeaa7f55eab44" + integrity sha512-kHszukYjTPVfCOEyrUthA3jqJwduY/P3eO8I0gMNOZGIQWKAwZftxmp5hq6paophvwo9NoUrcZOecs9ulOyyTg== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.2.0" + webpack-sources "^3.2.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +world-calendars@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" + integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= + dependencies: + object-assign "^4.1.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.3.1: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +ws@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" + integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zero-crossings@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" + integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= + dependencies: + cwise-compiler "^1.0.0" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== -- 2.34.1 From e512e9bbcf41b09376b82f7251ce59c433aeb090 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:11:49 +0300 Subject: [PATCH 060/143] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbf40304..f4e597ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: ubuntu-20.04 + runs-on: windows-latest timeout-minutes: 40 steps: - uses: actions/checkout@v2 -- 2.34.1 From f2f6608a2e21f3728576022e3e0a2fa7b0c485b9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:37:31 +0300 Subject: [PATCH 061/143] fix css rules excludes --- demo/playground/webpack.config.d/01.ring.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/demo/playground/webpack.config.d/01.ring.js b/demo/playground/webpack.config.d/01.ring.js index fbde1b41..b3cc4770 100644 --- a/demo/playground/webpack.config.d/01.ring.js +++ b/demo/playground/webpack.config.d/01.ring.js @@ -1,4 +1,5 @@ const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; +const path = require('path'); config.module.rules.push(...ringConfig.module.rules) @@ -6,7 +7,7 @@ config.module.rules.push( { test: /\.css$/, exclude: [ - 'D:\\Work\\Projects\\visionforge\\build\\js\\node_modules\\@jetbrains\\ring-ui' + path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") ], use: [ { -- 2.34.1 From ad9f43f5a5e5b7aa7766a94006ee214fc18902b9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 11 Jan 2022 19:40:12 +0300 Subject: [PATCH 062/143] Update build.yml --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4e597ac..1f87ce02 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,9 +16,6 @@ jobs: with: java-version: 11 distribution: liberica - - uses: actions/setup-node@v2.5.1 - with: - node-version: '16' - name: execute build uses: gradle/gradle-build-action@v2 with: -- 2.34.1 From bfa7f5ea573d0c30c63b179d1da752923a88465b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 11 Jan 2022 20:49:15 +0300 Subject: [PATCH 063/143] Remove unnecessary rotation and position updates --- .../src/jvmMain/kotlin/allThingsDemo.kt | 11 +++++++--- .../src/jvmMain/kotlin/serverExtensions.kt | 1 - .../space/kscience/visionforge/html/Page.kt | 2 ++ .../kscience/visionforge/solid/Composite.kt | 10 --------- .../kscience/visionforge/solid/Quaternion.kt | 11 ++++++++++ .../space/kscience/visionforge/solid/Solid.kt | 21 ++++++++++++++++--- .../kscience/visionforge/solid/SolidGroup.kt | 9 ++++---- .../kscience/visionforge/solid/geometry.kt | 10 ++++----- .../visionforge/solid/three/ThreeFactory.kt | 14 ++++++++++++- .../kscience/visionforge/solid/three/three.kt | 5 ----- 10 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 0ff49d40..9c68af8b 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.examples -import kotlinx.html.h1 import kotlinx.html.h2 import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType @@ -13,11 +12,15 @@ import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.markup.markdown import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.solid +import space.kscience.visionforge.solid.z import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.columnTable import java.nio.file.Paths + fun main() { val context = Context { plugin(Solids) @@ -41,7 +44,9 @@ fun main() { h2 { +"3D visualization with Three-js" } vision("3D") { solid { - box(100, 100, 100, name = "aBox") + box(100, 100, 100, name = "aBox"){ + z = 50.0 + } } } diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index b8bb633a..62d318ad 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -29,7 +29,6 @@ public fun Context.makeVisionFile( val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> mapOf( "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), - //"tables" to tabulatorCssHader ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index 96cae1ce..d575208e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -4,6 +4,8 @@ import kotlinx.html.* import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.VisionManager +//data class HeaderContainer + public data class Page( public val visionManager: VisionManager, public val title: String, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 3c7773bc..d63e08b6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -39,16 +39,6 @@ public inline fun VisionContainerBuilder.composite( res.meta.update(group.meta) - if (group.position != null) { - res.position = group.position - } - if (group.rotation != null) { - res.rotation = group.rotation - } - if (group.scale != null) { - res.scale = group.scale - } - set(name, res) return res } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt new file mode 100644 index 00000000..617c7a38 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt @@ -0,0 +1,11 @@ +package space.kscience.visionforge.solid + +import kotlin.jvm.JvmInline + +@JvmInline +public value class Quaternion(public val values: DoubleArray) + +public operator fun Quaternion.component1(): Double = values[0] +public operator fun Quaternion.component2(): Double = values[1] +public operator fun Quaternion.component3(): Double = values[2] +public operator fun Quaternion.component4(): Double = values[3] \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 39ed06ac..2b9c883b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -1,13 +1,21 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.enum +import space.kscience.dataforge.meta.descriptors.node +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.float +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY +import space.kscience.visionforge.hide +import space.kscience.visionforge.inherited +import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY import space.kscience.visionforge.solid.Solid.Companion.IGNORE_KEY import space.kscience.visionforge.solid.Solid.Companion.LAYER_KEY @@ -199,6 +207,13 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f) public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f) public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) +//public var Solid.quaternion: Quaternion? +// get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) } +// set(value) { +// meta[Solid::quaternion.name] = value?.values?.asValue() +// } + + public var Solid.scaleX: Number by float(X_SCALE_KEY, 1f) public var Solid.scaleY: Number by float(Y_SCALE_KEY, 1f) public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index b3e8ccd8..a501f7a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -60,10 +60,11 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { override fun createGroup(): SolidGroup = SolidGroup() - override fun update(change: VisionChange) { - updatePosition(change.properties) - super.update(change) - } +// +// override fun update(change: VisionChange) { +// updatePosition(change.properties) +// super.update(change) +// } public companion object { public val PROTOTYPES_TOKEN: NameToken = NameToken("@prototypes") diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index f815a262..a0ad09a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -117,8 +117,8 @@ internal fun Meta.toVector(default: Float = 0f) = Point3D( this[Solid.Z_KEY].float ?: default ) -internal fun Solid.updatePosition(meta: Meta?) { - meta?.get(Solid.POSITION_KEY)?.toVector()?.let { position = it } - meta?.get(Solid.ROTATION_KEY)?.toVector()?.let { rotation = it } - meta?.get(Solid.SCALE_KEY)?.toVector(1f)?.let { scale = it } -} \ No newline at end of file +//internal fun Solid.updatePosition(meta: Meta?) { +// meta?.get(Solid.POSITION_KEY)?.toVector()?.let { position = it } +// meta?.get(Solid.ROTATION_KEY)?.toVector()?.let { rotation = it } +// meta?.get(Solid.SCALE_KEY)?.toVector(1f)?.let { scale = it } +//} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 81749fd3..df9f2c94 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D +import info.laht.threekt.math.Euler import info.laht.threekt.objects.Mesh import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name @@ -36,7 +37,18 @@ public fun Object3D.updatePosition(obj: Vision) { visible = obj.visible ?: true if (obj is Solid) { position.set(obj.x, obj.y, obj.z) - setRotationFromEuler(obj.euler) + +// val quaternion = obj.quaternion +// +// if (quaternion != null) { +// val (x, y, z, w) = quaternion +// setRotationFromQuaternion(Quaternion(x, y, z, w)) +// } else { +// setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) +// } + + setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) + scale.set(obj.scaleX, obj.scaleY, obj.scaleZ) updateMatrix() } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index ea609e58..447cf4b6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -4,19 +4,14 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Layers import info.laht.threekt.external.controls.OrbitControls import info.laht.threekt.materials.Material -import info.laht.threekt.math.Euler import info.laht.threekt.math.Vector3 import info.laht.threekt.objects.Mesh import info.laht.threekt.textures.Texture import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.node -import space.kscience.visionforge.solid.* import kotlin.math.PI -public val Solid.euler: Euler get() = Euler(rotationX, rotationY, rotationZ, rotationOrder.name) - public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f) -- 2.34.1 From 9745a5887355e03bbbe0c12e1e48a4091f02a350 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jan 2022 11:13:17 +0300 Subject: [PATCH 064/143] Refactor page headers and fragment requirements --- .../kotlin/VisionForgePlayGroundForJupyter.kt | 4 +- .../src/jvmMain/kotlin/allThingsDemo.kt | 276 +++++++++--------- .../src/jvmMain/kotlin/formServer.kt | 14 +- .../src/jvmMain/kotlin/gdmlCubes.kt | 14 +- .../src/jvmMain/kotlin/gdmlCurve.kt | 12 +- .../playground/src/jvmMain/kotlin/gdmlIaxo.kt | 12 +- .../src/jvmMain/kotlin/plotlyVision.kt | 19 +- .../src/jvmMain/kotlin/randomSpheres.kt | 41 ++- .../src/jvmMain/kotlin/rootParser.kt | 9 +- .../src/jvmMain/kotlin/serverExtensions.kt | 27 +- .../src/jvmMain/kotlin/simpleCube.kt | 24 +- demo/playground/src/jvmMain/kotlin/tables.kt | 7 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 22 +- .../visionforge/solid/demo/ThreeDemoApp.kt | 4 +- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 4 +- .../jvmMain/kotlin/VisionForgeForNotebook.kt | 6 +- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 4 +- .../kscience/visionforge/html/HtmlFragment.kt | 7 +- .../visionforge/html/HtmlVisionRenderer.kt | 16 +- .../space/kscience/visionforge/html/Page.kt | 53 ++-- .../visionforge/html/VisionTagConsumer.kt | 64 ++-- .../kscience/visionforge/html/HtmlTagTest.kt | 5 +- .../kscience/visionforge/html/headers.kt | 6 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 5 +- .../visionforge/plotly/VisionOfPlotly.kt | 5 +- .../{three => }/server/VisionServer.kt | 76 ++--- .../kscience/visionforge/solid/Solids.kt | 6 +- .../visionforge/tables/VisionOfTable.kt | 6 +- .../visionforge/three/{server => }/jsMain.kt | 2 +- .../three/server/serverExtensions.kt | 30 -- .../visionforge/three/serverExtensions.kt | 29 ++ 31 files changed, 374 insertions(+), 435 deletions(-) rename visionforge-server/src/main/kotlin/space/kscience/visionforge/{three => }/server/VisionServer.kt (82%) rename visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/{server => }/jsMain.kt (83%) delete mode 100644 visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt create mode 100644 visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 6cbe311d..651b580d 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -36,13 +36,13 @@ internal class VisionForgePlayGroundForJupyter : JupyterPluginBase( render { gdmlModel -> handler.produceHtml { - vision(gdmlModel.toVision()) + vision { gdmlModel.toVision() } } } render { plot -> handler.produceHtml { - vision(plot.asVision()) + vision { plot.asVision() } } } } diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 9c68af8b..23b73af4 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 -import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode @@ -10,177 +9,166 @@ import space.kscience.plotly.scatter import space.kscience.tables.ColumnHeader import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.markup.markdown -import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.box import space.kscience.visionforge.solid.solid import space.kscience.visionforge.solid.z -import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.columnTable import java.nio.file.Paths -fun main() { - val context = Context { - plugin(Solids) - plugin(PlotlyPlugin) - plugin(TableVisionPlugin) +fun main() = makeVisionFile( + Paths.get("VisionForgeDemo.html"), + resourceLocation = ResourceLocation.EMBED +) { + markdown { + //language=markdown + """ + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + """.trimIndent() } - context.makeVisionFile( - Paths.get("VisionForgeDemo.html"), - resourceLocation = ResourceLocation.EMBED - ) { - markdown { - //language=markdown - """ - # VisionForge - - This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) - """.trimIndent() - } - - h2 { +"3D visualization with Three-js" } - vision("3D") { - solid { - box(100, 100, 100, name = "aBox"){ - z = 50.0 - } + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox"){ + z = 50.0 } } + } - h2 { +"Interactive plots with Plotly" } - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" } + marker { size = 12 } + } - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" } + marker { size = 12 } + } - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") } } } } - h2 { +"Interactive tables with Tabulator" } - vision("table") { - val x by ColumnHeader.value(ValueType.NUMBER) - val y by ColumnHeader.value(ValueType.NUMBER) - columnTable( - x to listOf(2, 3, 4, 5), - y to listOf(10, 15, 13, 17) - ) - } - markdown { - //language=markdown - """ - ## The code for everything above - ```kotlin - markdown { - //language=markdown - ""${'"'} - # VisionForge - - This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) - ""${'"'}.trimIndent() + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + markdown { + //language=markdown + """ + ## The code for everything above + ```kotlin + markdown { + //language=markdown + ""${'"'} + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + ""${'"'}.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") } - - h2 { +"3D visualization with Three-js" } - vision("3D") { - solid { - box(100, 100, 100, name = "aBox") + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } } - } - - h2 { +"Interactive plots with Plotly" } - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" } - - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) } - - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") } } } } - h2 { +"Interactive tables with Tabulator" } - vision("table") { - val x by ColumnHeader.value(ValueType.NUMBER) - val y by ColumnHeader.value(ValueType.NUMBER) - columnTable( - x to listOf(2, 3, 4, 5), - y to listOf(10, 15, 13, 17) - ) - } - ``` - """.trimIndent() - } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + ``` + """.trimIndent() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index c5276554..7397b6b6 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -3,21 +3,19 @@ package space.kscience.visionforge.examples import kotlinx.html.* import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch -import space.kscience.dataforge.names.asName import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.three.server.close -import space.kscience.visionforge.three.server.openInBrowser -import space.kscience.visionforge.three.server.serve -import space.kscience.visionforge.three.server.useScript +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.serve fun main() { val visionManager = Global.fetch(VisionManager) val server = visionManager.serve { - useScript("js/visionforge-playground.js") - page { + page(header = Page.scriptHeader("js/visionforge-playground.js")) { val form = formFragment("form") { label { htmlFor = "fname" @@ -50,7 +48,7 @@ fun main() { } } - vision("form".asName(), form) + vision("form") { form } form.onPropertyChange { println(this) } diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt index 9de22003..d5d483bc 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt @@ -1,19 +1,13 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision("canvas") { - GdmlShowCase.cubes().toVision() - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ + vision("canvas") { + requirePlugin(Solids) + GdmlShowCase.cubes().toVision() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 1a646d97..81facd71 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.* import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation @@ -10,13 +9,9 @@ import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.visible import java.nio.file.Path -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceLocation.EMBED) { +fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceLocation.EMBED) { vision("canvas") { + requirePlugin(Solids) Gdml { // geometry variables val worldSize = 500 @@ -240,5 +235,4 @@ fun main() { } } } - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt index a9070af7..6ee718a2 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt @@ -1,16 +1,12 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.solid.Solids -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile { - vision("canvas") { GdmlShowCase.babyIaxo().toVision() } +fun main() = makeVisionFile { + vision("canvas") { + requirePlugin(Solids) + GdmlShowCase.babyIaxo().toVision() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt index 4575b952..4b91c352 100644 --- a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt +++ b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt @@ -1,22 +1,15 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.plotly.scatter import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -fun main() { - val context = Context { - plugin(PlotlyPlugin) - } - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision { - plotly { - scatter { - x(1, 2, 3) - y(5, 8, 7) - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision { + plotly { + scatter { + x(1, 2, 3) + y(5, 8, 7) } } } diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index 0185bdc8..2d9a5f05 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -2,37 +2,30 @@ package space.kscience.visionforge.examples import kotlinx.html.div import kotlinx.html.h1 -import space.kscience.dataforge.context.Context import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.* import java.nio.file.Paths import kotlin.random.Random -fun main() { - val context = Context { - plugin(Solids) - } +private val random = Random(112233) - val random = Random(112233) - - context.makeVisionFile( - Paths.get("randomSpheres.html"), - resourceLocation = ResourceLocation.SYSTEM - ) { - h1 { +"Happy new year!" } - div { - vision { - solid { - repeat(100) { - sphere(5, name = "sphere[$it]") { - x = random.nextDouble(-300.0, 300.0) - y = random.nextDouble(-300.0, 300.0) - z = random.nextDouble(-300.0, 300.0) - material { - color(random.nextInt()) - } - detail = 16 +fun main() = makeVisionFile( + Paths.get("randomSpheres.html"), + resourceLocation = ResourceLocation.SYSTEM +) { + h1 { +"Happy new year!" } + div { + vision { + solid { + repeat(100) { + sphere(5, name = "sphere[$it]") { + x = random.nextDouble(-300.0, 300.0) + y = random.nextDouble(-300.0, 300.0) + z = random.nextDouble(-300.0, 300.0) + material { + color(random.nextInt()) } + detail = 16 } } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index afe8528f..184557da 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.examples import ru.mipt.npm.root.DGeoManager import ru.mipt.npm.root.serialization.TGeoManager import ru.mipt.npm.root.toSolid -import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf @@ -22,11 +21,6 @@ private fun Meta.countTypes(): Sequence = sequence { } fun main() { - val context = Context { - plugin(Solids) - } - - val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { it.nextEntry it.readAllBytes().decodeToString() @@ -45,8 +39,9 @@ fun main() { Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid)) - context.makeVisionFile { + makeVisionFile { vision("canvas") { + requirePlugin(Solids) solid } } diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 62d318ad..e8be7112 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -1,34 +1,25 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.context.Global +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.VisionTagConsumer -import space.kscience.visionforge.html.page -import space.kscience.visionforge.html.scriptHeader +import space.kscience.visionforge.html.importScriptHeader import space.kscience.visionforge.makeFile -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.useScript -import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path - -public fun VisionServer.usePlayground(): Unit { - useScript("js/visionforge-playground.js") -} - -@OptIn(DFExperimental::class) -public fun Context.makeVisionFile( +public fun makeVisionFile( path: Path? = null, title: String = "VisionForge page", resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, show: Boolean = true, - content: VisionTagConsumer<*>.() -> Unit, + content: HtmlVisionFragment, ): Unit { - val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> + val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> mapOf( - "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + "title" to Page.title(title), + "playground" to Page.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/demo/playground/src/jvmMain/kotlin/simpleCube.kt b/demo/playground/src/jvmMain/kotlin/simpleCube.kt index f804228b..e1fc91eb 100644 --- a/demo/playground/src/jvmMain/kotlin/simpleCube.kt +++ b/demo/playground/src/jvmMain/kotlin/simpleCube.kt @@ -1,21 +1,17 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.material +import space.kscience.visionforge.solid.solid -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision("canvas") { - solid { - box(100, 100, 100) - material { - emissiveColor("red") - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision("canvas") { + solid { + box(100, 100, 100) + material { + emissiveColor("red") } } } diff --git a/demo/playground/src/jvmMain/kotlin/tables.kt b/demo/playground/src/jvmMain/kotlin/tables.kt index c386ffda..46cad89d 100644 --- a/demo/playground/src/jvmMain/kotlin/tables.kt +++ b/demo/playground/src/jvmMain/kotlin/tables.kt @@ -1,22 +1,17 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType import space.kscience.tables.ColumnHeader import space.kscience.tables.valueRow import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.table import kotlin.math.pow fun main() { - val context = Context { - plugin(TableVisionPlugin) - } val x by ColumnHeader.value(ValueType.NUMBER) val y by ColumnHeader.value(ValueType.NUMBER) - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { vision { table(x, y) { repeat(100) { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 93f2ec7c..fbacc5b1 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -1,19 +1,22 @@ package ru.mipt.npm.sat -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.plus +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.serve import space.kscience.visionforge.solid.* -import space.kscience.visionforge.three.server.* +import space.kscience.visionforge.three.threeJsHeader import space.kscience.visionforge.visionManager import kotlin.random.Random + fun main() { val satContext = Context("sat") { plugin(Solids) @@ -23,20 +26,17 @@ fun main() { val sat = visionOfSatellite(ySegments = 3) val server = satContext.visionManager.serve { - //use client library - useThreeJs() - //use css - useCss("css/styles.css") - page { + page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { div("flex-column") { h1 { +"Satellite detector demo" } - vision(sat) + vision { sat } } } } server.openInBrowser() + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch { while (isActive) { val randomLayer = Random.nextInt(1, 11) diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt index db6ebbff..eb27f4d6 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid.demo import kotlinx.browser.document -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch @@ -30,7 +29,8 @@ private class ThreeDemoApp : Application { } } } - GlobalScope.launch { + + launch { while (isActive) { delay(500) boxes.forEach { box -> diff --git a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt index 4eb4c9f7..2fbe51c8 100644 --- a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -44,7 +44,7 @@ public abstract class JupyterPluginBase(final override val context: Context) : J render { vision -> handler.produceHtml { - vision(vision) + vision { vision } } } @@ -62,7 +62,7 @@ public abstract class JupyterPluginBase(final override val context: Context) : J } } fragment(fragment.formBody) - vision(fragment.vision) + vision { fragment.vision } } } diff --git a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt index 8b17bc82..a91733ce 100644 --- a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt @@ -18,8 +18,8 @@ import space.kscience.dataforge.meta.string import space.kscience.visionforge.html.HtmlFormFragment import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.server.VisionServer +import space.kscience.visionforge.server.serve import space.kscience.visionforge.visionManager /** @@ -75,7 +75,7 @@ public class VisionForgeForNotebook(override val context: Context) : ContextAwar fragment: HtmlVisionFragment, ): String = server?.serveVisionsFromFragment("content[${counter++}]", fragment) ?: createHTML().apply { - visionFragment(context.visionManager, fragment = fragment) + visionFragment(context, fragment = fragment) }.finalize() public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 9dc95d6d..0a112ba2 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -29,7 +29,9 @@ internal class GdmlForJupyter : JupyterPluginBase( ) render { gdmlModel -> - handler.produceHtml { vision(gdmlModel.toVision()) } + handler.produceHtml { + vision { gdmlModel.toVision() } + } } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt index 343a29ce..b733e6a4 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt @@ -6,7 +6,7 @@ import kotlinx.html.stream.createHTML public typealias HtmlFragment = TagConsumer<*>.() -> Unit -public fun HtmlFragment.render(): String = createHTML().apply(this).finalize() +public fun HtmlFragment.renderToString(): String = createHTML().apply(this).finalize() public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { fragment() @@ -14,4 +14,9 @@ public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { public fun FlowContent.fragment(fragment: HtmlFragment) { fragment(consumer) +} + +public operator fun HtmlFragment.plus(other: HtmlFragment): HtmlFragment = { + this@plus() + other() } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 6ec98684..f5abdf42 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.html import kotlinx.html.* +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -28,7 +30,7 @@ internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" * @param renderScript if true add rendering script after the fragment */ public fun TagConsumer<*>.visionFragment( - manager: VisionManager, + context: Context = Global, embedData: Boolean = true, fetchDataUrl: String? = null, fetchUpdatesUrl: String? = null, @@ -37,8 +39,8 @@ public fun TagConsumer<*>.visionFragment( fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(this@visionFragment, manager, idPrefix) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { + val consumer = object : VisionTagConsumer(this@visionFragment, context, idPrefix) { + override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision // Toggle update mode @@ -78,19 +80,19 @@ public fun TagConsumer<*>.visionFragment( } public fun FlowContent.visionFragment( - manager: VisionManager, + context: Context = Global, embedData: Boolean = true, fetchDataUrl: String? = null, fetchUpdatesUrl: String? = null, idPrefix: String? = null, - renderSctipt: Boolean = true, + renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map = consumer.visionFragment( - manager, + context, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, - renderSctipt, + renderScript, fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index d575208e..bdd5e417 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -1,37 +1,52 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.VisionManager - -//data class HeaderContainer +import space.kscience.dataforge.context.Context public data class Page( - public val visionManager: VisionManager, - public val title: String, - public val headers: Map, + public val context: Context, + public val headers: Map = emptyMap(), public val content: HtmlVisionFragment, ) { public fun render(root: TagConsumer): R = root.apply { head { meta { charset = "utf-8" - headers.values.forEach { - fragment(it) - } } - title(this@Page.title) + headers.values.forEach { + fragment(it) + } } body { - visionFragment(visionManager, fragment = content) + visionFragment(context, fragment = content) } }.finalize() -} + public companion object{ + /** + * Use a script with given [src] as a global header for all pages. + */ + public fun scriptHeader(src: String, block: SCRIPT.() -> Unit = {}): HtmlFragment = { + script { + type = "text/javascript" + this.src = src + block() + } + } -@DFExperimental -public fun VisionManager.page( - title: String = "VisionForge page", - vararg headers: Pair, - content: HtmlVisionFragment, -): Page = Page(this, title, mapOf(*headers), content) \ No newline at end of file + /** + * Use css with given stylesheet link as a global header for all pages. + */ + public fun styleSheetHeader(href: String, block: LINK.() -> Unit = {}): HtmlFragment = { + link { + rel = "stylesheet" + this.href = href + block() + } + } + + public fun title(title:String): HtmlFragment = { + title(title) + } + } +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 7a17f0f5..afdd686f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.html import kotlinx.html.* +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.MutableMeta @@ -9,9 +11,12 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.VisionTagConsumer.Companion.DEFAULT_VISION_NAME import space.kscience.visionforge.setAsRoot +import space.kscience.visionforge.visionManager import kotlin.collections.set @DslMarker @@ -22,10 +27,25 @@ public annotation class VisionDSL */ @DFExperimental @VisionDSL -public class VisionOutput @PublishedApi internal constructor(public val manager: VisionManager) { +public class VisionOutput @PublishedApi internal constructor(public val context: Context, public val name: Name?) { public var meta: Meta = Meta.EMPTY - //TODO expose a way to define required plugins. + private val requirements: MutableSet> = HashSet() + + public fun requirePlugin(factory: PluginFactory<*>) { + requirements.add(factory) + } + + internal fun buildVisionManager(): VisionManager = + if (requirements.all { req -> context.plugins.find(true) { it.tag == req.tag } != null }) { + context.visionManager + } else { + val newContext = context.buildContext(NameToken(DEFAULT_VISION_NAME, name.toString()).asName()) { + plugin(VisionManager) + requirements.forEach { plugin(it) } + } + newContext.visionManager + } public inline fun meta(block: MutableMeta.() -> Unit) { this.meta = Meta(block) @@ -36,9 +56,10 @@ public class VisionOutput @PublishedApi internal constructor(public val manager: * Modified [TagConsumer] that allows rendering output fragments and visions in them */ @VisionDSL +@OptIn(DFExperimental::class) public abstract class VisionTagConsumer( private val root: TagConsumer, - public val manager: VisionManager, + public val context: Context, private val idPrefix: String? = null, ) : TagConsumer by root { @@ -46,23 +67,26 @@ public abstract class VisionTagConsumer( /** * Render a vision inside the output fragment + * @param manager a [VisionManager] to be used in renderer * @param name name of the output container * @param vision an object to be rendered * @param outputMeta optional configuration for the output container */ - protected abstract fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) + protected abstract fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) /** * Create a placeholder for a vision output with optional [Vision] in it * TODO with multi-receivers could be replaced by [VisionTagConsumer, TagConsumer] extension */ - public fun TagConsumer.vision( + private fun TagConsumer.vision( name: Name, - vision: Vision? = null, + manager: VisionManager, + vision: Vision, outputMeta: Meta = Meta.EMPTY, ): T = div { id = resolveId(name) classes = setOf(OUTPUT_CLASS) + vision.setAsRoot(manager) attributes[OUTPUT_NAME_ATTRIBUTE] = name.toString() if (!outputMeta.isEmpty()) { //Hard-code output configuration @@ -73,9 +97,7 @@ public abstract class VisionTagConsumer( } } } - vision?.let { - renderVision(name, it, outputMeta) - } + renderVision(manager, name, vision, outputMeta) } /** @@ -83,14 +105,14 @@ public abstract class VisionTagConsumer( * TODO replace by multi-receiver */ @OptIn(DFExperimental::class) - public inline fun TagConsumer.vision( - name: Name, + public fun TagConsumer.vision( + name: Name? = null, @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, ): T { - val output = VisionOutput(manager) + val output = VisionOutput(context, name) val vision = output.visionProvider() - vision.setAsRoot(manager) - return vision(name, vision, output.meta) + val actualName = name ?: NameToken(DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() + return vision(actualName, output.buildVisionManager(), vision, output.meta) } /** @@ -98,14 +120,10 @@ public abstract class VisionTagConsumer( */ @OptIn(DFExperimental::class) @VisionDSL - public inline fun TagConsumer.vision( - name: String = DEFAULT_VISION_NAME, - visionProvider: VisionOutput.() -> Vision, - ): T = vision(Name.parse(name), visionProvider) - public fun TagConsumer.vision( - vision: Vision, - ): T = vision(NameToken("vision", vision.hashCode().toString()).asName(), vision) + name: String?, + @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, + ): T = vision(name?.parseAsName(), visionProvider) /** * Process the resulting object produced by [TagConsumer] @@ -114,9 +132,7 @@ public abstract class VisionTagConsumer( //do nothing by default } - override fun finalize(): R { - return root.finalize().also { processResult(it) } - } + override fun finalize(): R = root.finalize().also { processResult(it) } public companion object { public const val OUTPUT_CLASS: String = "visionforge-output" diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index d6cd8dd1..42a9ba1f 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.html import kotlinx.html.* import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.set @@ -23,8 +22,8 @@ fun FlowContent.renderVisionFragment( fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(consumer, Global.fetch(VisionManager), idPrefix) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { + val consumer = object : VisionTagConsumer(consumer, Global, idPrefix) { + override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision renderer(name, vision, outputMeta) } diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index 9837c60a..d8be2a39 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -4,7 +4,6 @@ import kotlinx.html.link import kotlinx.html.script import kotlinx.html.unsafe import org.slf4j.LoggerFactory -import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.VisionManager import java.nio.file.Files import java.nio.file.Path @@ -113,10 +112,9 @@ internal fun fileCssHeader( } /** - * Make a script header, automatically copying file to appropriate location + * Make a script header from a resource file, automatically copying file to appropriate location */ -@DFExperimental -public fun scriptHeader( +public fun Page.Companion.importScriptHeader( scriptResource: String, resourceLocation: ResourceLocation, htmlPath: Path? = null, diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index d1b89c9e..f80a5511 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -390,4 +390,7 @@ public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoa @VisionBuilder @DFExperimental -public inline fun VisionOutput.gdml(block: Gdml.() -> Unit): SolidGroup = Gdml(block).toVision() \ No newline at end of file +public inline fun VisionOutput.gdml(block: Gdml.() -> Unit): SolidGroup { + requirePlugin(Solids) + return Gdml(block).toVision() +} \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index eaa94573..ebb4773c 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -24,4 +24,7 @@ public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) @DFExperimental public inline fun VisionOutput.plotly( block: Plot.() -> Unit, -): VisionOfPlotly = VisionOfPlotly(Plotly.plot(block)) \ No newline at end of file +): VisionOfPlotly { + requirePlugin(PlotlyPlugin) + return VisionOfPlotly(Plotly.plot(block)) +} \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt similarity index 82% rename from visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt rename to visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index b5b78ba0..2abb6efb 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.three.server +package space.kscience.visionforge.server import io.ktor.application.* import io.ktor.features.CORS @@ -14,9 +14,9 @@ import io.ktor.routing.* import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.embeddedServer +import io.ktor.util.getOrFail import io.ktor.websocket.WebSockets import io.ktor.websocket.webSocket -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @@ -32,9 +32,8 @@ import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.fragment import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE +import space.kscience.visionforge.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI import kotlin.time.Duration.Companion.milliseconds @@ -48,7 +47,10 @@ public class VisionServer internal constructor( private val visionManager: VisionManager, private val serverUrl: Url, private val root: Route, -) : Configurable, CoroutineScope by root.application { +) : Configurable { + + public val application: Application get() = root.application + override val meta: ObservableMutableMeta = MutableMeta() /** @@ -76,22 +78,10 @@ public class VisionServer internal constructor( */ public var dataUpdate: Boolean by meta.boolean(true, Name.parse("data.update")) - /** - * a list of headers that should be applied to all pages - */ - private val globalHeaders: ArrayList = ArrayList() - - /** - * Add a header to all pages produced by this server - */ - public fun header(block: TagConsumer<*>.() -> Unit) { - globalHeaders.add(block) - } - private fun HTML.visionPage( title: String, pagePath: String, - headers: List, + header: HtmlFragment, visionFragment: HtmlVisionFragment, ): Map { var visionMap: Map? = null @@ -99,16 +89,14 @@ public class VisionServer internal constructor( head { meta { charset = "utf-8" - (globalHeaders + headers).forEach { - fragment(it) - } + header() } title(title) } body { //Load the fragment and remember all loaded visions visionMap = visionFragment( - manager = visionManager, + context = visionManager.context, embedData = true, fetchUpdatesUrl = "$serverUrl$pagePath/ws", fragment = visionFragment @@ -127,9 +115,7 @@ public class VisionServer internal constructor( //Update websocket webSocket("ws") { - val name: String = call.request.queryParameters["name"] - ?: error("Vision name is not defined in parameters") - + val name: String = call.request.queryParameters.getOrFail("name") application.log.debug("Opened server socket for $name") val vision: Vision = visions[Name.parse(name)] ?: error("Plot with id='$name' not registered") @@ -158,8 +144,7 @@ public class VisionServer internal constructor( } //Plots in their json representation get("data") { - val name: String = call.request.queryParameters["name"] - ?: error("Vision name is not defined in parameters") + val name: String = call.request.queryParameters.getOrFail("name") val vision: Vision? = visions[Name.parse(name)] if (vision == null) { @@ -178,7 +163,7 @@ public class VisionServer internal constructor( /** * Serve visions in a given [route] without providing a page template */ - public fun serveVisions(route: String, visions: Map): Unit { + public fun serveVisions(route: String, visions: Map) { root.route(route) { serveVisions(this, visions) } @@ -192,7 +177,7 @@ public class VisionServer internal constructor( fragment: HtmlVisionFragment, ): String = createHTML().apply { val visions = visionFragment( - visionManager, + visionManager.context, embedData = true, fetchUpdatesUrl = "$serverUrl$route/ws", renderScript = true, @@ -203,12 +188,11 @@ public class VisionServer internal constructor( /** * Serve a page, potentially containing any number of visions at a given [pagePath] with given [headers]. - * */ public fun page( pagePath: String = DEFAULT_PAGE, title: String = "VisionForge server page '$pagePath'", - headers: List = emptyList(), + header: HtmlFragment = {}, visionFragment: HtmlVisionFragment, ) { val visions = HashMap() @@ -216,7 +200,7 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(visionPage(title, pagePath, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, header, visionFragment)) } } else { null @@ -230,7 +214,7 @@ public class VisionServer internal constructor( //re-create html and vision list on each call call.respondHtml { visions.clear() - visions.putAll(visionPage(title, pagePath, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, header, visionFragment)) } } else { //Use cached html @@ -249,32 +233,6 @@ public class VisionServer internal constructor( } } -/** - * Use a script with given [src] as a global header for all pages. - */ -public inline fun VisionServer.useScript(src: String, crossinline block: SCRIPT.() -> Unit = {}) { - header { - script { - type = "text/javascript" - this.src = src - block() - } - } -} - -/** - * Use css with given stylesheet link as a global header for all pages. - */ -public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() -> Unit = {}) { - header { - link { - rel = "stylesheet" - this.href = href - block() - } - } -} - /** * Attach VisionForge server application to given server */ diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index c5b9b04b..12a22ab6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -69,5 +69,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { @VisionBuilder @DFExperimental -public inline fun VisionOutput.solid(block: SolidGroup.() -> Unit): SolidGroup = - SolidGroup().apply(block) +public inline fun VisionOutput.solid(block: SolidGroup.() -> Unit): SolidGroup { + requirePlugin(Solids) + return SolidGroup().apply(block) +} diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index a3147236..95888f67 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -87,7 +87,10 @@ public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.Na public inline fun VisionOutput.table( vararg headers: ColumnHeader, block: MutableRowTable.() -> Unit, -): VisionOfTable = RowTable(*headers, block = block).toVision() +): VisionOfTable { + requirePlugin(TableVisionPlugin) + return RowTable(*headers, block = block).toVision() +} @DFExperimental public inline fun VisionOutput.columnTable( @@ -99,6 +102,7 @@ public inline fun VisionOutput.columnTable( public fun VisionOutput.columnTable( vararg dataAndHeaders: Pair, List>, ): VisionOfTable { + requirePlugin(TableVisionPlugin) val columns = dataAndHeaders.map { (header, data) -> ListColumn(header, data.map { Value.of(it) }) } diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt similarity index 83% rename from visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt rename to visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index d6d191f0..ed2908f5 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.three.server +package space.kscience.visionforge.three import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.runVisionClient diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt deleted file mode 100644 index d6656c46..00000000 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt +++ /dev/null @@ -1,30 +0,0 @@ -package space.kscience.visionforge.three.server - -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.page -import space.kscience.visionforge.html.scriptHeader -import space.kscience.visionforge.makeFile -import java.awt.Desktop -import java.nio.file.Path - - -public fun VisionServer.useThreeJs(): Unit { - useScript("js/visionforge-three.js") -} - -@DFExperimental -public fun VisionManager.makeThreeJsFile( - content: HtmlVisionFragment, - path: Path? = null, - title: String = "VisionForge page", - resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, - show: Boolean = true, -): Unit { - val actualPath = page(title, content = content).makeFile(path) { actualPath -> - mapOf("threeJs" to scriptHeader("js/visionforge-three.js", resourceLocation, actualPath)) - } - if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) -} diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt new file mode 100644 index 00000000..6c70e0ed --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -0,0 +1,29 @@ +package space.kscience.visionforge.three + +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.html.* +import space.kscience.visionforge.makeFile +import java.awt.Desktop +import java.nio.file.Path + + +public val Page.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") + + +@DFExperimental +public fun makeThreeJsFile( + path: Path? = null, + title: String = "VisionForge page", + resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, + show: Boolean = true, + content: HtmlVisionFragment, +): Unit { + val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> + mapOf( + "title" to Page.title(title), + "threeJs" to Page.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) + ) + } + if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) +} -- 2.34.1 From 8a6fab97e3dc443465dc4d0d9f71796e6557e8a2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jan 2022 11:52:58 +0300 Subject: [PATCH 065/143] Update gh-actions and api --- .github/workflows/build.yml | 2 +- .github/workflows/pages.yml | 17 +- .github/workflows/publish.yml | 27 + .gitignore | 1 + build.gradle.kts | 2 +- cern-root-loader/api/cern-root-loader.api | 926 ++++++++++++++++ demo/gdml/api/gdml.api | 27 + demo/muon-monitor/api/muon-monitor.api | 148 +++ .../npm/muon/monitor/{server => }/MMServer.kt | 0 demo/playground/api/playground.api | 60 ++ demo/sat-demo/api/sat-demo.api | 5 + demo/solid-showcase/api/solid-showcase.api | 48 + visionforge-core/api/visionforge-core.api | 815 ++++++++++++++ visionforge-gdml/api/visionforge-gdml.api | 49 + .../api/visionforge-markdown.api | 40 + visionforge-plotly/api/visionforge-plotly.api | 42 + visionforge-server/api/visionforge-server.api | 36 + visionforge-solid/api/visionforge-solid.api | 996 ++++++++++++++++++ visionforge-tables/api/visionforge-tables.api | 63 ++ .../api/visionforge-threejs-server.api | 6 + 20 files changed, 3298 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 cern-root-loader/api/cern-root-loader.api create mode 100644 demo/gdml/api/gdml.api create mode 100644 demo/muon-monitor/api/muon-monitor.api rename demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/{server => }/MMServer.kt (100%) create mode 100644 demo/playground/api/playground.api create mode 100644 demo/sat-demo/api/sat-demo.api create mode 100644 demo/solid-showcase/api/solid-showcase.api create mode 100644 visionforge-core/api/visionforge-core.api create mode 100644 visionforge-gdml/api/visionforge-gdml.api create mode 100644 visionforge-markdown/api/visionforge-markdown.api create mode 100644 visionforge-plotly/api/visionforge-plotly.api create mode 100644 visionforge-server/api/visionforge-server.api create mode 100644 visionforge-solid/api/visionforge-solid.api create mode 100644 visionforge-tables/api/visionforge-tables.api create mode 100644 visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f87ce02..8c73f7d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: windows-latest + runs-on: ubuntu-latest timeout-minutes: 40 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 134d3d48..aee354f6 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -10,18 +10,15 @@ jobs: timeout-minutes: 40 steps: - uses: actions/checkout@v2 - - uses: DeLaGuardo/setup-graalvm@4.0 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - uses: actions/cache@v2 + java-version: 11 + distribution: liberica + - name: execute build + uses: gradle/gradle-build-action@v2 with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - run: ./gradlew dokkaHtmlMultiModule --build-cache --no-daemon --no-parallel --stacktrace + arguments: dokkaHtmlMultiModule - uses: JamesIves/github-pages-deploy-action@4.1.0 with: branch: gh-pages diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..99355168 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,27 @@ +name: Gradle publish + +on: + workflow_dispatch: + release: + types: [ created ] + +jobs: + publish: + environment: + name: publish + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 + with: + java-version: 11 + distribution: liberica + - name: execute build + uses: gradle/gradle-build-action@v2 + - name: Publish + shell: bash + run: > + ./gradlew release --no-daemon --build-cache -Ppublishing.enabled=true + -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} + -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} diff --git a/.gitignore b/.gitignore index 33607764..7fab40d3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ out/ .gradle build/ +data/ !gradle-wrapper.jar diff --git a/build.gradle.kts b/build.gradle.kts index 664171c9..0f892c76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ val fxVersion by extra("11") allprojects{ group = "space.kscience" - version = "0.2.0-dev-99" + version = "0.2.0" } subprojects { diff --git a/cern-root-loader/api/cern-root-loader.api b/cern-root-loader/api/cern-root-loader.api new file mode 100644 index 00000000..2788976b --- /dev/null +++ b/cern-root-loader/api/cern-root-loader.api @@ -0,0 +1,926 @@ +public final class ru/mipt/npm/root/DGeoBoolNode : ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFLeft ()Lru/mipt/npm/root/DGeoShape; + public final fun getFLeftMat ()Lru/mipt/npm/root/DGeoMatrix; + public final fun getFRight ()Lru/mipt/npm/root/DGeoShape; + public final fun getFRightMat ()Lru/mipt/npm/root/DGeoMatrix; +} + +public final class ru/mipt/npm/root/DGeoManager : ru/mipt/npm/root/DNamed { + public static final field Companion Lru/mipt/npm/root/DGeoManager$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFMatrices ()Ljava/util/List; + public final fun getFNodes ()Ljava/util/List; + public final fun getFShapes ()Ljava/util/List; + public final fun getFVolumes ()Ljava/util/List; +} + +public final class ru/mipt/npm/root/DGeoManager$Companion { + public final fun parse (Ljava/lang/String;)Lru/mipt/npm/root/DGeoManager; +} + +public final class ru/mipt/npm/root/DGeoMaterial : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +} + +public class ru/mipt/npm/root/DGeoMatrix : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +} + +public final class ru/mipt/npm/root/DGeoMedium : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFMaterial ()Lru/mipt/npm/root/DGeoMaterial; + public final fun getFParams ()[D +} + +public final class ru/mipt/npm/root/DGeoNode : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFVolume ()Lru/mipt/npm/root/DGeoVolume; +} + +public class ru/mipt/npm/root/DGeoScale : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFScale ()[D + public final fun getX ()D + public final fun getY ()D + public final fun getZ ()D +} + +public final class ru/mipt/npm/root/DGeoShape : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFDX ()D + public final fun getFDY ()D + public final fun getFDZ ()D +} + +public final class ru/mipt/npm/root/DGeoVolume : ru/mipt/npm/root/DNamed, space/kscience/dataforge/misc/Named { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFFillColor ()Ljava/lang/Integer; + public final fun getFMedium ()Lru/mipt/npm/root/DGeoMedium; + public final fun getFNodes ()Ljava/util/List; + public final fun getFShape ()Lru/mipt/npm/root/DGeoShape; + public fun getName ()Lspace/kscience/dataforge/names/Name; +} + +public class ru/mipt/npm/root/DNamed : ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFName ()Ljava/lang/String; + public final fun getFTitle ()Ljava/lang/String; +} + +public class ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getRefCache ()Lru/mipt/npm/root/DObjectCache; + public final fun getTypename ()Ljava/lang/String; +} + +public final class ru/mipt/npm/root/DObjectCache { + public static final field Companion Lru/mipt/npm/root/DObjectCache$Companion; + public fun (Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun get (I)Lspace/kscience/dataforge/meta/Meta; + public final fun getRefStack ()Ljava/util/List; + public final fun stack (I)Lru/mipt/npm/root/DObjectCache; +} + +public final class ru/mipt/npm/root/DObjectCache$Companion { + public final fun getEmpty ()Lru/mipt/npm/root/DObjectCache; +} + +public final class ru/mipt/npm/root/DObjectKt { + public static final fun doubleArray (Lspace/kscience/dataforge/meta/MetaProvider;[DLspace/kscience/dataforge/names/Name;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun doubleArray$default (Lspace/kscience/dataforge/meta/MetaProvider;[DLspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; +} + +public final class ru/mipt/npm/root/DRootToSolidKt { + public static final fun toSolid (Lru/mipt/npm/root/DGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class ru/mipt/npm/root/RootColors { + public static final field INSTANCE Lru/mipt/npm/root/RootColors; + public final fun get (I)Ljava/lang/String; +} + +public final class ru/mipt/npm/root/serialization/JsonToRootKt { + public static final fun decodeFromJson (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/json/JsonElement;)Lru/mipt/npm/root/serialization/TObject; + public static final fun decodeFromString (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/KSerializer;Ljava/lang/String;)Lru/mipt/npm/root/serialization/TObject; +} + +public final class ru/mipt/npm/root/serialization/RootToSolidKt { + public static final fun toSolid (Lru/mipt/npm/root/serialization/TGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public class ru/mipt/npm/root/serialization/TGeoBBox : ru/mipt/npm/root/serialization/TGeoShape { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoBBox$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDX ()D + public final fun getFDY ()D + public final fun getFDZ ()D + public final fun getFOrigin ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBBox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoBBox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoBBox$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoBBox; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoBBox;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoBBox$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoBoolNode : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoBoolNode$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public abstract fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public final fun getFLeftMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public abstract fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public final fun getFRightMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoBoolNode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoCombiTrans$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([DLru/mipt/npm/root/serialization/TGeoRotation;)V + public synthetic fun ([DLru/mipt/npm/root/serialization/TGeoRotation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFRotation ()Lru/mipt/npm/root/serialization/TGeoRotation; + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCombiTrans;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCombiTrans; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoCombiTrans;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoCompositeShape$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoBoolNode;)V + public final fun getFNode ()Lru/mipt/npm/root/serialization/TGeoBoolNode; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCompositeShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCompositeShape; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoCompositeShape;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoHMatrix$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D[D[D)V + public final fun getFRotationMatrix ()[D + public final fun getFScale ()[D + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoHMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoHMatrix$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoHMatrix; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoHMatrix;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoIdentity$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIdentity;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIdentity$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIdentity; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoIdentity;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoIntersection$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIntersection;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIntersection$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIntersection; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoIntersection;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoManager : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoManager$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFMatrices ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFNodes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFShapes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFVolumes ()Lru/mipt/npm/root/serialization/TObjArray; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoManager;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoManager$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoManager$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoManager; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoManager;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoManager$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoMaterial : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMaterial$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMaterial;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMaterial$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMaterial$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMaterial; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMaterial;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMaterial$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoMatrix : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMatrix$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMedium$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;ILru/mipt/npm/root/serialization/TGeoMaterial;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILru/mipt/npm/root/serialization/TGeoMaterial;[D)V + public final fun getFId ()I + public final fun getFMaterial ()Lru/mipt/npm/root/serialization/TGeoMaterial; + public final fun getFParams ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMedium;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMedium$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMedium; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMedium;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture : ru/mipt/npm/root/serialization/TGeoMaterial { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMixture$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMixture;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMixture$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMixture; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMixture;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoNode : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNode$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[ILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFGeoAtt-pVg5ArA ()I + public final fun getFNovlp ()I + public final fun getFNumber ()I + public final fun getFOverlaps ()[I + public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolume; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNode$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNode; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNode;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix : ru/mipt/npm/root/serialization/TGeoNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[ILru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFMatrix ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeMatrix; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNodeMatrix;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset : ru/mipt/npm/root/serialization/TGeoNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeOffset$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[IDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFOffset ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeOffset;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeOffset; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNodeOffset;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoPcon : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoPcon$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIDD[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDphi ()D + public final fun getFNz ()I + public final fun getFPhi1 ()D + public final fun getFRmax ()[D + public final fun getFRmin ()[D + public final fun getFZ ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPcon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoPcon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPcon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPcon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoPcon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoPcon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoPgon : ru/mipt/npm/root/serialization/TGeoPcon { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoPgon$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIDD[D[D[DILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFNedges ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPgon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoPgon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPgon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPgon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoPgon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoPgon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoRotation$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D)V + public final fun getFRotationMatrix ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoRotation$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoRotation; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoRotation;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoShape : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoShape$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFShapeBits-pVg5ArA ()I + public final fun getFShapeId ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoShape$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoShapeAssembly$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Z)V + public synthetic fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFBBoxOK ()Z + public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShapeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoShapeAssembly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoShapeAssembly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeRef : ru/mipt/npm/root/serialization/TGeoShape { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoShape; +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoSubtraction$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoSubtraction;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoSubtraction$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoSubtraction; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoSubtraction;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTranslation$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D)V + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTranslation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTranslation$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTranslation; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTranslation;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoTube : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTube$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DDDDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDz ()D + public final fun getFRmax ()D + public final fun getFRmin ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTube;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTube$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTube$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTube; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTube;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTube$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg : ru/mipt/npm/root/serialization/TGeoTube { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTubeSeg$Companion; + public fun (DDDDDDDDD)V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DDDDDDDDDDDDDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFC1 ()D + public final fun getFC2 ()D + public final fun getFCdfi ()D + public final fun getFCm ()D + public final fun getFPhi1 ()D + public final fun getFPhi2 ()D + public final fun getFS1 ()D + public final fun getFS2 ()D + public final fun getFSm ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTubeSeg;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTubeSeg; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTubeSeg;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoUnion$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoUnion;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoUnion$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoUnion; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoUnion;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoVolume : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoVolume$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILjava/lang/Integer;Lkotlin/UInt;Ljava/lang/Integer;Ljava/lang/Integer;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoMedium;IIILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFFillColor ()Ljava/lang/Integer; + public final fun getFFillStyle ()Ljava/lang/Integer; + public final fun getFGeoAtt-pVg5ArA ()I + public final fun getFLineColor ()I + public final fun getFLineStyle ()Ljava/lang/Integer; + public final fun getFLineWidth-pVg5ArA ()I + public final fun getFMedium ()Lru/mipt/npm/root/serialization/TGeoMedium; + public final fun getFNodes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFNtotal ()I + public final fun getFNumber ()I + public final fun getFRefCount ()I + public final fun getFShape ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolume;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoVolume$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolume$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolume; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoVolume;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolume$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoVolumeAssembly : ru/mipt/npm/root/serialization/TGeoVolume { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILjava/lang/Integer;Lkotlin/UInt;Ljava/lang/Integer;Ljava/lang/Integer;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoMedium;IIILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssembly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssemblyRef : ru/mipt/npm/root/serialization/TGeoVolumeAssembly { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeRef : ru/mipt/npm/root/serialization/TGeoVolume { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoVolume; +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoXtru$Companion; + public fun (IID[D[D[D[D[D[D)V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIID[D[D[D[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFNvert ()I + public final fun getFNz ()I + public final fun getFScale ()[D + public final fun getFX ()[D + public final fun getFX0 ()[D + public final fun getFY ()[D + public final fun getFY0 ()[D + public final fun getFZ ()[D + public final fun getFZcurrent ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoXtru;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoXtru$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoXtru; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoXtru;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/THashList : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/THashList$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/THashList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/THashList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/THashList$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/THashList; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/THashList;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/THashList$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TList : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TList$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TList$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TList; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TList;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TList$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TNamed : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TNamed$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFName ()Ljava/lang/String; + public final fun getFTitle ()Ljava/lang/String; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TNamed;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TNamed$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TNamed$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TNamed; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TNamed;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TNamed$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TObjArray : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TObjArray$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/KSerializer;)V +} + +public final class ru/mipt/npm/root/serialization/TObjArray$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun (Lkotlinx/serialization/KSerializer;)V + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TObjArray; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TObjArray;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TObjArray$Companion { + public final fun getEmpty ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TObject$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFBits-pVg5ArA ()I + public final fun getFUniqueID-pVg5ArA ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TObject$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + diff --git a/demo/gdml/api/gdml.api b/demo/gdml/api/gdml.api new file mode 100644 index 00000000..480385c3 --- /dev/null +++ b/demo/gdml/api/gdml.api @@ -0,0 +1,27 @@ +public final class space/kscience/visionforge/gdml/demo/GDMLDemoApp : tornadofx/App { + public fun ()V +} + +public final class space/kscience/visionforge/gdml/demo/GDMLView : tornadofx/View { + public static final field Companion Lspace/kscience/visionforge/gdml/demo/GDMLView$Companion; + public fun ()V + public fun getRoot ()Ljavafx/scene/Parent; +} + +public final class space/kscience/visionforge/gdml/demo/GDMLView$Companion { +} + +public final class space/kscience/visionforge/gdml/demo/GdmlFxDemoAppKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/gdml/demo/ReadFileKt { + public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/io/File;)Lspace/kscience/visionforge/Vision; + public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; +} + +public final class space/kscience/visionforge/gdml/demo/SaveToJsonKt { + public static final fun main ([Ljava/lang/String;)V +} + diff --git a/demo/muon-monitor/api/muon-monitor.api b/demo/muon-monitor/api/muon-monitor.api new file mode 100644 index 00000000..da3a84ed --- /dev/null +++ b/demo/muon-monitor/api/muon-monitor.api @@ -0,0 +1,148 @@ +public final class ru/mipt/npm/muon/monitor/Event { + public static final field Companion Lru/mipt/npm/muon/monitor/Event$Companion; + public synthetic fun (IILjava/util/List;Ljava/util/Collection;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (ILjava/util/List;Ljava/util/Collection;)V + public final fun component1 ()I + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/Collection; + public final fun copy (ILjava/util/List;Ljava/util/Collection;)Lru/mipt/npm/muon/monitor/Event; + public static synthetic fun copy$default (Lru/mipt/npm/muon/monitor/Event;ILjava/util/List;Ljava/util/Collection;ILjava/lang/Object;)Lru/mipt/npm/muon/monitor/Event; + public fun equals (Ljava/lang/Object;)Z + public final fun getHits ()Ljava/util/Collection; + public final fun getId ()I + public final fun getTrack ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lru/mipt/npm/muon/monitor/Event;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/muon/monitor/Event$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/muon/monitor/Event$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/muon/monitor/Event; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/muon/monitor/Event;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/muon/monitor/Event$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/muon/monitor/Model { + public fun (Lspace/kscience/visionforge/VisionManager;)V + public final fun displayEvent (Lru/mipt/npm/muon/monitor/Event;)V + public final fun encodeToString ()Ljava/lang/String; + public final fun getManager ()Lspace/kscience/visionforge/VisionManager; + public final fun getRoot ()Lspace/kscience/visionforge/solid/SolidGroup; + public final fun getTracks ()Lspace/kscience/visionforge/solid/SolidGroup; + public final fun reset ()V + public final fun setTracks (Lspace/kscience/visionforge/solid/SolidGroup;)V +} + +public final class ru/mipt/npm/muon/monitor/Monitor { + public static final field CENTRAL_LAYER_Z F + public static final field GEOMETRY_TOLERANCE D + public static final field INSTANCE Lru/mipt/npm/muon/monitor/Monitor; + public static final field LOWER_LAYER_Z F + public static final field PIXEL_XY_SIZE F + public static final field PIXEL_XY_SPACING F + public static final field PIXEL_Z_SIZE F + public static final field UPPER_LAYER_Z F + public final fun getDetectors ()Ljava/util/Collection; + public final fun getPixels ()Ljava/util/Collection; +} + +public final class ru/mipt/npm/muon/monitor/ReadResourceKt { + public static final fun readResource (Ljava/lang/String;)Ljava/lang/String; +} + +public final class ru/mipt/npm/muon/monitor/SC1 { + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFF)V + public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getName ()Ljava/lang/String; + public final fun getXSize ()F + public final fun getYSize ()F + public final fun getZSize ()F +} + +public final class ru/mipt/npm/muon/monitor/SC16 { + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getName ()Ljava/lang/String; + public final fun getPixels ()Ljava/util/Collection; +} + +public final class ru/mipt/npm/muon/monitor/server/MMServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V + public static final fun module (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;)V + public static synthetic fun module$default (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;ILjava/lang/Object;)V +} + +public final class ru/mipt/npm/muon/monitor/sim/Cos2TrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;DFF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public final fun getPower ()D + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + +public final class ru/mipt/npm/muon/monitor/sim/FixedAngleGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public final fun getPhi ()D + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; + public final fun getTheta ()D +} + +public final class ru/mipt/npm/muon/monitor/sim/LineKt { + public static final fun getPhi (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getTheta (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getX (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getY (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun makeTrack (DDDD)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public static final fun makeTrack (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public static final fun toPoint (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun toPoints (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Ljava/util/List; +} + +public final class ru/mipt/npm/muon/monitor/sim/MonitorKt { + public static final fun buildEventByTrack (ILorg/apache/commons/math3/geometry/euclidean/threed/Line;Lkotlin/jvm/functions/Function1;)Lru/mipt/npm/muon/monitor/Event; + public static synthetic fun buildEventByTrack$default (ILorg/apache/commons/math3/geometry/euclidean/threed/Line;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lru/mipt/npm/muon/monitor/Event; + public static final fun findLayer (F)Lorg/apache/commons/math3/geometry/euclidean/threed/Plane; + public static final fun getDefaultHitResolver ()Lkotlin/jvm/functions/Function1; + public static final fun readEffs ()Ljava/util/Map; +} + +public final class ru/mipt/npm/muon/monitor/sim/PixelKt { + public static final fun isHit (Lru/mipt/npm/muon/monitor/SC1;Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Z +} + +public final class ru/mipt/npm/muon/monitor/sim/SimulationKt { + public static final fun simulateOne (Lru/mipt/npm/muon/monitor/sim/TrackGenerator;)Lru/mipt/npm/muon/monitor/Event; +} + +public abstract interface class ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public abstract fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public abstract fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + +public final class ru/mipt/npm/muon/monitor/sim/UniformTrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;FF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt similarity index 100% rename from demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt rename to demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt diff --git a/demo/playground/api/playground.api b/demo/playground/api/playground.api new file mode 100644 index 00000000..7a050caa --- /dev/null +++ b/demo/playground/api/playground.api @@ -0,0 +1,60 @@ +public final class space/kscience/visionforge/examples/AllThingsDemoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/FormServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlCubesKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlCurveKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlIaxoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GenerateSchemaKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/PlotlyVisionKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/RandomSpheresKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/RootParserKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/ServerExtensionsKt { + public static final fun makeVisionFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun makeVisionFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/examples/SimpleCubeKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/TablesKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/sat-demo/api/sat-demo.api b/demo/sat-demo/api/sat-demo.api new file mode 100644 index 00000000..00e5cedd --- /dev/null +++ b/demo/sat-demo/api/sat-demo.api @@ -0,0 +1,5 @@ +public final class ru/mipt/npm/sat/SatServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/solid-showcase/api/solid-showcase.api b/demo/solid-showcase/api/solid-showcase.api new file mode 100644 index 00000000..4cc47c7d --- /dev/null +++ b/demo/solid-showcase/api/solid-showcase.api @@ -0,0 +1,48 @@ +public final class space/kscience/visionforge/demo/MetaEditorDemo : tornadofx/View { + public fun ()V + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public synthetic fun getRoot ()Ljavafx/scene/Parent; + public fun getRoot ()Ljavafx/scene/control/SplitPane; +} + +public final class space/kscience/visionforge/demo/MetaEditorDemoApp : tornadofx/App { + public fun ()V +} + +public final class space/kscience/visionforge/demo/MetaEditorDemoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/demo/DemoKt { + public static final fun demo (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun demo$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static final fun getCanvasOptions ()Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions; + public static final fun showcase (Lspace/kscience/visionforge/solid/demo/VisionLayout;)V + public static final fun showcaseCSG (Lspace/kscience/visionforge/solid/demo/VisionLayout;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoApp : tornadofx/App { + public fun ()V + public final fun getView ()Lspace/kscience/visionforge/solid/demo/FXDemoGrid; + public fun start (Ljavafx/stage/Stage;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoAppKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoGrid : tornadofx/View, space/kscience/visionforge/solid/demo/VisionLayout { + public fun ()V + public fun getRoot ()Ljavafx/scene/Parent; + public synthetic fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract interface class space/kscience/visionforge/solid/demo/VisionLayout { + public abstract fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun render$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api new file mode 100644 index 00000000..0937e26d --- /dev/null +++ b/visionforge-core/api/visionforge-core.api @@ -0,0 +1,815 @@ +public final class space/kscience/visionforge/Colors { + public static final field BLUE_KEY Ljava/lang/String; + public static final field GREEN_KEY Ljava/lang/String; + public static final field INSTANCE Lspace/kscience/visionforge/Colors; + public static final field RED_KEY Ljava/lang/String; + public static final field aliceblue I + public static final field antiquewhite I + public static final field aqua I + public static final field aquamarine I + public static final field azure I + public static final field beige I + public static final field bisque I + public static final field black I + public static final field blanchedalmond I + public static final field blue I + public static final field blueviolet I + public static final field brown I + public static final field burlywood I + public static final field cadetblue I + public static final field chartreuse I + public static final field chocolate I + public static final field coral I + public static final field cornflowerblue I + public static final field cornsilk I + public static final field crimson I + public static final field cyan I + public static final field darkblue I + public static final field darkcyan I + public static final field darkgoldenrod I + public static final field darkgray I + public static final field darkgreen I + public static final field darkgrey I + public static final field darkkhaki I + public static final field darkmagenta I + public static final field darkolivegreen I + public static final field darkorange I + public static final field darkorchid I + public static final field darkred I + public static final field darksalmon I + public static final field darkseagreen I + public static final field darkslateblue I + public static final field darkslategray I + public static final field darkslategrey I + public static final field darkturquoise I + public static final field darkviolet I + public static final field deeppink I + public static final field deepskyblue I + public static final field dimgray I + public static final field dimgrey I + public static final field dodgerblue I + public static final field firebrick I + public static final field floralwhite I + public static final field forestgreen I + public static final field fuchsia I + public static final field gainsboro I + public static final field ghostwhite I + public static final field gold I + public static final field goldenrod I + public static final field gray I + public static final field green I + public static final field greenyellow I + public static final field grey I + public static final field honeydew I + public static final field hotpink I + public static final field indianred I + public static final field indigo I + public static final field ivory I + public static final field khaki I + public static final field lavender I + public static final field lavenderblush I + public static final field lawngreen I + public static final field lemonchiffon I + public static final field lightblue I + public static final field lightcoral I + public static final field lightcyan I + public static final field lightgoldenrodyellow I + public static final field lightgray I + public static final field lightgreen I + public static final field lightgrey I + public static final field lightpink I + public static final field lightsalmon I + public static final field lightseagreen I + public static final field lightskyblue I + public static final field lightslategray I + public static final field lightslategrey I + public static final field lightsteelblue I + public static final field lightyellow I + public static final field lime I + public static final field limegreen I + public static final field linen I + public static final field magenta I + public static final field maroon I + public static final field mediumaquamarine I + public static final field mediumblue I + public static final field mediumorchid I + public static final field mediumpurple I + public static final field mediumseagreen I + public static final field mediumslateblue I + public static final field mediumspringgreen I + public static final field mediumturquoise I + public static final field mediumvioletred I + public static final field midnightblue I + public static final field mintcream I + public static final field mistyrose I + public static final field moccasin I + public static final field navajowhite I + public static final field navy I + public static final field oldlace I + public static final field olive I + public static final field olivedrab I + public static final field orange I + public static final field orangered I + public static final field orchid I + public static final field palegoldenrod I + public static final field palegreen I + public static final field paleturquoise I + public static final field palevioletred I + public static final field papayawhip I + public static final field peachpuff I + public static final field peru I + public static final field pink I + public static final field plum I + public static final field powderblue I + public static final field purple I + public static final field rebeccapurple I + public static final field red I + public static final field rosybrown I + public static final field royalblue I + public static final field saddlebrown I + public static final field salmon I + public static final field sandybrown I + public static final field seagreen I + public static final field seashell I + public static final field sienna I + public static final field silver I + public static final field skyblue I + public static final field slateblue I + public static final field slategray I + public static final field slategrey I + public static final field snow I + public static final field springgreen I + public static final field steelblue I + public static final field tan I + public static final field teal I + public static final field thistle I + public static final field tomato I + public static final field turquoise I + public static final field violet I + public static final field wheat I + public static final field white I + public static final field whitesmoke I + public static final field yellow I + public static final field yellowgreen I + public final fun fromMeta (Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/String; + public final fun rgbToString (I)Ljava/lang/String; + public final fun rgbToString-8NGXxBw (BBB)Ljava/lang/String; +} + +public final class space/kscience/visionforge/ComputedVisionPropertiesKt { + public static final fun computeProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun computeProperties$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public static final fun computeProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/Value; + public static synthetic fun computeProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public static final fun computePropertyNode (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun computePropertyNode$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public static final fun computePropertyValues (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/MutableValueProvider; + public static synthetic fun computePropertyValues$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/MutableValueProvider; +} + +public final class space/kscience/visionforge/HtmlExportKt { + public static final fun makeFile (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;)Ljava/nio/file/Path; + public static synthetic fun makeFile$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/nio/file/Path; + public static final fun show (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;)V + public static synthetic fun show$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;ILjava/lang/Object;)V +} + +public abstract interface class space/kscience/visionforge/MutableVisionGroup : space/kscience/visionforge/VisionContainerBuilder, space/kscience/visionforge/VisionGroup { + public abstract fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public abstract fun removeStructureListener (Ljava/lang/Object;)V +} + +public class space/kscience/visionforge/SimpleVisionPropertyContainer : space/kscience/dataforge/meta/Configurable, space/kscience/visionforge/VisionPropertyContainer { + public fun (Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; +} + +public final class space/kscience/visionforge/StyleReference { + public fun (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)V + public final fun getName ()Ljava/lang/String; + public final fun getOwner ()Lspace/kscience/visionforge/VisionGroup; +} + +public final class space/kscience/visionforge/StyleReferenceKt { + public static final fun style (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static final fun style (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;)V +} + +public final class space/kscience/visionforge/StyleSheet { + public static final field Companion Lspace/kscience/visionforge/StyleSheet$Companion; + public static final synthetic fun box-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/StyleSheet; + public static fun constructor-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; + public static final fun define-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/visionforge/VisionGroup;)Z + public static final fun get-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getItems-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Map; + public fun hashCode ()I + public static fun hashCode-impl (Lspace/kscience/visionforge/VisionGroup;)I + public static final fun invoke-impl (Lspace/kscience/visionforge/VisionGroup;Lkotlin/jvm/functions/Function1;)V + public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lspace/kscience/visionforge/VisionGroup; +} + +public final class space/kscience/visionforge/StyleSheet$Companion { + public final fun getSTYLESHEET_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/StyleSheetKt { + public static final fun getStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getStyleNodes (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Ljava/util/List; + public static final fun getStyleProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; + public static final fun getStyleSheet (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; + public static final fun getStyles (Lspace/kscience/visionforge/Vision;)Ljava/util/List; + public static final fun setStyles (Lspace/kscience/visionforge/Vision;Ljava/util/List;)V + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)V +} + +public abstract interface class space/kscience/visionforge/Vision : space/kscience/dataforge/meta/Configurable, space/kscience/dataforge/meta/descriptors/Described { + public static final field Companion Lspace/kscience/visionforge/Vision$Companion; + public static final field TYPE Ljava/lang/String; + public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getManager ()Lspace/kscience/visionforge/VisionManager; + public abstract fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public abstract fun getParent ()Lspace/kscience/visionforge/VisionGroup; + public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public abstract fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public abstract fun setParent (Lspace/kscience/visionforge/VisionGroup;)V + public abstract fun update (Lspace/kscience/visionforge/VisionChange;)V +} + +public final class space/kscience/visionforge/Vision$Companion { + public static final field TYPE Ljava/lang/String; + public final fun getSTYLE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getVISIBLE_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public class space/kscience/visionforge/VisionBase : space/kscience/visionforge/Vision { + public static final field Companion Lspace/kscience/visionforge/VisionBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;)V + public synthetic fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getParent ()Lspace/kscience/visionforge/VisionGroup; + protected final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public fun setParent (Lspace/kscience/visionforge/VisionGroup;)V + protected final fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V + public fun update (Lspace/kscience/visionforge/VisionChange;)V + public static final fun write$Self (Lspace/kscience/visionforge/VisionBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionBase$Companion { + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public final fun updateProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract interface annotation class space/kscience/visionforge/VisionBuilder : java/lang/annotation/Annotation { +} + +public final class space/kscience/visionforge/VisionChange { + public static final field Companion Lspace/kscience/visionforge/VisionChange$Companion; + public fun ()V + public synthetic fun (IZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)V + public synthetic fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2 ()Lspace/kscience/visionforge/Vision; + public final fun component3 ()Lspace/kscience/dataforge/meta/Meta; + public final fun component4 ()Ljava/util/Map; + public final fun copy (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)Lspace/kscience/visionforge/VisionChange; + public static synthetic fun copy$default (Lspace/kscience/visionforge/VisionChange;ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionChange; + public fun equals (Ljava/lang/Object;)Z + public final fun getChildren ()Ljava/util/Map; + public final fun getDelete ()Z + public final fun getProperties ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/Vision; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/VisionChange;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionChange$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionChange$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionChange; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionChange;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionChange$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionChangeBuilder : space/kscience/visionforge/VisionContainerBuilder { + public fun ()V + public final fun deepCopy ()Lspace/kscience/visionforge/VisionChange; + public final fun isEmpty ()Z + public final fun propertyChanged (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionChangeKt { + public static final fun VisionChange (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/VisionChange; + public static final fun flowChanges-HG0u8IE (Lspace/kscience/visionforge/Vision;J)Lkotlinx/coroutines/flow/Flow; +} + +public abstract interface class space/kscience/visionforge/VisionContainer { + public abstract fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; +} + +public abstract interface class space/kscience/visionforge/VisionContainerBuilder { + public abstract fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionDelegatesKt { + public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; + public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; + public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +} + +public final class space/kscience/visionforge/VisionDescriptorKt { + public static final fun getHidden (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Z + public static final fun getInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/Boolean; + public static final fun getInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/Boolean; + public static final fun getUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/Boolean; + public static final fun getUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/Boolean; + public static final fun getWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/String; + public static final fun getWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/String; + public static final fun hide (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)V + public static final fun setInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/Boolean;)V + public static final fun setUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/Boolean;)V + public static final fun setWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Lspace/kscience/dataforge/meta/Meta;)V + public static final fun setWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/String;)V +} + +public abstract interface class space/kscience/visionforge/VisionGroup : space/kscience/dataforge/provider/Provider, space/kscience/visionforge/Vision, space/kscience/visionforge/VisionContainer { + public static final field Companion Lspace/kscience/visionforge/VisionGroup$Companion; + public static final field STYLE_TARGET Ljava/lang/String; + public fun content (Ljava/lang/String;)Ljava/util/Map; + public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; + public abstract fun getChildren ()Ljava/util/Map; + public fun getDefaultTarget ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionGroup$Companion { + public static final field STYLE_TARGET Ljava/lang/String; +} + +public class space/kscience/visionforge/VisionGroupBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/MutableVisionGroup { + public static final field Companion Lspace/kscience/visionforge/VisionGroupBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/Map;)V + public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + protected fun addStatic (Lspace/kscience/visionforge/Vision;)V + protected final fun childrenChanged (Lspace/kscience/dataforge/names/Name;)V + protected fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; + public fun getChildren ()Ljava/util/Map; + protected final fun getChildrenInternal ()Ljava/util/Map; + public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public fun removeStructureListener (Ljava/lang/Object;)V + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public fun update (Lspace/kscience/visionforge/VisionChange;)V + public static final fun write$Self (Lspace/kscience/visionforge/VisionGroupBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionGroupBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionGroupBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionGroupBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionGroupBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionGroupBase$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionGroupBaseKt { + public static final fun setAsRoot (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/VisionManager;)V +} + +public final class space/kscience/visionforge/VisionGroupKt { + public static final fun get (Lspace/kscience/visionforge/VisionContainer;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public static final fun getStructureChanges (Lspace/kscience/visionforge/MutableVisionGroup;)Lkotlinx/coroutines/flow/Flow; + public static final fun isEmpty (Lspace/kscience/visionforge/VisionGroup;)Z + public static final fun iterator (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Iterator; + public static final fun removeAll (Lspace/kscience/visionforge/MutableVisionGroup;)V + public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lspace/kscience/visionforge/Vision;)V + public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/NameToken;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionKt { + public static final fun getPropertyChanges (Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/flow/Flow; + public static final fun getPropertyValue (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; + public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;)V + public static final fun setProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Object;)V + public static final fun setPropertyNode (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Object;)V + public static final fun setVisible (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V + public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/VisionManager : space/kscience/dataforge/context/AbstractPlugin { + public static final field Companion Lspace/kscience/visionforge/VisionManager$Companion; + public static final field VISION_SERIALIZER_MODULE_TARGET Ljava/lang/String; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public final fun decodeFromJson (Lkotlinx/serialization/json/JsonElement;)Lspace/kscience/visionforge/Vision; + public final fun decodeFromMeta (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/visionforge/Vision; + public static synthetic fun decodeFromMeta$default (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/visionforge/Vision; + public final fun decodeFromString (Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public final fun encodeToJsonElement (Lspace/kscience/visionforge/Vision;)Lkotlinx/serialization/json/JsonElement; + public final fun encodeToMeta (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun encodeToMeta$default (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public final fun encodeToString (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; + public final fun encodeToString (Lspace/kscience/visionforge/VisionChange;)Ljava/lang/String; + public final fun getJsonFormat ()Lkotlinx/serialization/json/Json; + public final fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/VisionManager$Companion : space/kscience/dataforge/context/PluginFactory { + public final fun getDefaultJson ()Lkotlinx/serialization/json/Json; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; +} + +public final class space/kscience/visionforge/VisionManagerKt { + public static final fun encodeToString (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; + public static final fun getVisionManager (Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; +} + +public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/dataforge/context/AbstractPlugin { + public fun ()V + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public synthetic fun (Lspace/kscience/dataforge/meta/Meta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun content (Ljava/lang/String;)Ljava/util/Map; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + protected abstract fun getVisionSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; +} + +public abstract interface class space/kscience/visionforge/VisionPropertyContainer { + public abstract fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/VisionPropertyContainer;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; +} + +public final class space/kscience/visionforge/html/HeadersKt { + public static final fun importScriptHeader (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;)Lkotlin/jvm/functions/Function1; + public static synthetic fun importScriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; +} + +public final class space/kscience/visionforge/html/HtmlFormFragment { + public final fun get (Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public final fun getFormBody ()Lkotlin/jvm/functions/Function1; + public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/html/VisionOfHtmlForm; +} + +public final class space/kscience/visionforge/html/HtmlFragmentKt { + public static final fun fragment (Lkotlinx/html/FlowContent;Lkotlin/jvm/functions/Function1;)V + public static final fun fragment (Lkotlinx/html/TagConsumer;Lkotlin/jvm/functions/Function1;)V + public static final fun plus (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static final fun renderToString (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; +} + +public final class space/kscience/visionforge/html/HtmlVisionRendererKt { + public static final fun HtmlVisionFragment (Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; + public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; + public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; + public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; +} + +public final class space/kscience/visionforge/html/Page { + public static final field Companion Lspace/kscience/visionforge/html/Page$Companion; + public fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lspace/kscience/dataforge/context/Context; + public final fun component2 ()Ljava/util/Map; + public final fun component3 ()Lkotlin/jvm/functions/Function1; + public final fun copy (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/Page; + public static synthetic fun copy$default (Lspace/kscience/visionforge/html/Page;Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/Page; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lkotlin/jvm/functions/Function1; + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getHeaders ()Ljava/util/Map; + public fun hashCode ()I + public final fun render (Lkotlinx/html/TagConsumer;)Ljava/lang/Object; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/html/Page$Companion { + public final fun scriptHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static synthetic fun scriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; + public final fun styleSheetHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static synthetic fun styleSheetHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; + public final fun title (Ljava/lang/String;)Lkotlin/jvm/functions/Function1; +} + +public final class space/kscience/visionforge/html/ResourceLocation : java/lang/Enum { + public static final field EMBED Lspace/kscience/visionforge/html/ResourceLocation; + public static final field LOCAL Lspace/kscience/visionforge/html/ResourceLocation; + public static final field SYSTEM Lspace/kscience/visionforge/html/ResourceLocation; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/html/ResourceLocation; + public static fun values ()[Lspace/kscience/visionforge/html/ResourceLocation; +} + +public abstract interface annotation class space/kscience/visionforge/html/VisionDSL : java/lang/annotation/Annotation { +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfCheckbox$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getChecked ()Ljava/lang/Boolean; + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun setChecked (Ljava/lang/Boolean;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfCheckbox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfCheckbox$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfCheckbox; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfCheckbox;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlForm$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V + public final fun getFormId ()Ljava/lang/String; + public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; + public final fun setValues (Lspace/kscience/dataforge/meta/Meta;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfHtmlForm$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfHtmlForm;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { + public static final fun HtmlFormFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/HtmlFormFragment; + public static synthetic fun HtmlFormFragment$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFormFragment; + public static final fun formFragment (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; + public static synthetic fun formFragment$default (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; +} + +public abstract class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/VisionBase { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getDisabled ()Z + public final fun setDisabled (Z)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlInput$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfNumberField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfNumberField$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getValue ()Ljava/lang/Number; + public final fun setValue (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfNumberField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfNumberField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfNumberField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfNumberField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfNumberField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfNumberField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfRangeField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfRangeField$Companion; + public fun (DDDLjava/lang/String;Ljava/lang/String;)V + public synthetic fun (DDDLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;DDDLjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getMax ()D + public final fun getMin ()D + public final fun getName ()Ljava/lang/String; + public final fun getStep ()D + public final fun getValue ()Ljava/lang/Number; + public final fun setValue (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfRangeField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfRangeField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfRangeField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfRangeField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfRangeField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfRangeField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfTextField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfTextField$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getText ()Ljava/lang/String; + public final fun setText (Ljava/lang/String;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfTextField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfTextField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfTextField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfTextField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfTextField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfTextField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOutput { + public fun (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/names/Name;)V + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun meta (Lkotlin/jvm/functions/Function1;)V + public final fun requirePlugin (Lspace/kscience/dataforge/context/PluginFactory;)V + public final fun setMeta (Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlinx/html/TagConsumer { + public static final field AUTO_DATA_ATTRIBUTE Ljava/lang/String; + public static final field Companion Lspace/kscience/visionforge/html/VisionTagConsumer$Companion; + public static final field DEFAULT_ENDPOINT Ljava/lang/String; + public static final field DEFAULT_VISION_NAME Ljava/lang/String; + public static final field OUTPUT_CLASS Ljava/lang/String; + public static final field OUTPUT_CONNECT_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_DATA_CLASS Ljava/lang/String; + public static final field OUTPUT_ENDPOINT_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_FETCH_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_META_CLASS Ljava/lang/String; + public static final field OUTPUT_NAME_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_RENDERED Ljava/lang/String; + public fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;)V + public synthetic fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun finalize ()Ljava/lang/Object; + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public fun onTagAttributeChange (Lkotlinx/html/Tag;Ljava/lang/String;Ljava/lang/String;)V + public fun onTagComment (Ljava/lang/CharSequence;)V + public fun onTagContent (Ljava/lang/CharSequence;)V + public fun onTagContentEntity (Lkotlinx/html/Entities;)V + public fun onTagContentUnsafe (Lkotlin/jvm/functions/Function1;)V + public fun onTagEnd (Lkotlinx/html/Tag;)V + public fun onTagError (Lkotlinx/html/Tag;Ljava/lang/Throwable;)V + public fun onTagEvent (Lkotlinx/html/Tag;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public fun onTagStart (Lkotlinx/html/Tag;)V + protected fun processResult (Ljava/lang/Object;)V + protected abstract fun renderVision (Lkotlinx/html/DIV;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public fun resolveId (Lspace/kscience/dataforge/names/Name;)Ljava/lang/String; + public final fun vision (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public final fun vision (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static synthetic fun vision$default (Lspace/kscience/visionforge/html/VisionTagConsumer;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/html/VisionTagConsumer$Companion { +} + +public final class space/kscience/visionforge/visitor/CountDistinctKt { + public static final fun countDistinct (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun countDistinctBy (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/visitor/DefaultVisionStatistics { + public fun (Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;)V + public final fun component1 ()Lspace/kscience/dataforge/names/Name; + public final fun component2 ()Lkotlin/reflect/KClass; + public final fun copy (Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;)Lspace/kscience/visionforge/visitor/DefaultVisionStatistics; + public static synthetic fun copy$default (Lspace/kscience/visionforge/visitor/DefaultVisionStatistics;Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;ILjava/lang/Object;)Lspace/kscience/visionforge/visitor/DefaultVisionStatistics; + public fun equals (Ljava/lang/Object;)Z + public final fun getDepth ()I + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getType ()Lkotlin/reflect/KClass; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/visitor/StatisticsVisitorKt { + public static final fun flowStatistics (Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun flowStatistics (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract interface class space/kscience/visionforge/visitor/VisionVisitor { + public static final field Companion Lspace/kscience/visionforge/visitor/VisionVisitor$Companion; + public fun skip (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)Z + public abstract fun visit (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun visitChildren (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionGroup;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/visitor/VisionVisitor$Companion { + public final fun visitTree (Lspace/kscience/visionforge/visitor/VisionVisitor;Lkotlinx/coroutines/CoroutineScope;Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/Job; +} + diff --git a/visionforge-gdml/api/visionforge-gdml.api b/visionforge-gdml/api/visionforge-gdml.api new file mode 100644 index 00000000..1a73d170 --- /dev/null +++ b/visionforge-gdml/api/visionforge-gdml.api @@ -0,0 +1,49 @@ +public final class space/kscience/visionforge/gdml/GdmlJVMKt { + public static final fun gdml (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/nio/file/Path;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun gdml$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/nio/file/Path;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderKt { + public static final fun gdml (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun gdml (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/gdml/Gdml;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun gdml$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/gdml/Gdml;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static final fun toVision (Lspace/kscience/gdml/Gdml;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun toVision$default (Lspace/kscience/gdml/Gdml;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions { + public static final field Companion Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Companion; + public fun ()V + public final fun configure (Lkotlin/jvm/functions/Function4;)V + public final fun getAUnit ()Lspace/kscience/gdml/AUnit; + public final fun getConfigurePaint ()Lkotlin/jvm/functions/Function3; + public final fun getConfigureSolid ()Lkotlin/jvm/functions/Function4; + public final fun getLUnit ()Lspace/kscience/gdml/LUnit; + public final fun getSolidAction ()Lkotlin/jvm/functions/Function1; + public final fun getVolumeAction ()Lkotlin/jvm/functions/Function1; + public final fun paint (Lkotlin/jvm/functions/Function3;)V + public final fun registerAndUseStyle (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public final fun setAUnit (Lspace/kscience/gdml/AUnit;)V + public final fun setLUnit (Lspace/kscience/gdml/LUnit;)V + public final fun setSolidAction (Lkotlin/jvm/functions/Function1;)V + public final fun setVolumeAction (Lkotlin/jvm/functions/Function1;)V + public final fun transparent (Lspace/kscience/visionforge/solid/Solid;)V +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions$Action : java/lang/Enum { + public static final field ADD Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static final field PROTOTYPE Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static final field REJECT Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static fun values ()[Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions$Companion { + public final fun randomColor (Lspace/kscience/gdml/GdmlMaterial;)I +} + +public final class space/kscience/visionforge/gdml/MarkLayersKt { + public static final fun markLayers (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/util/List;)V + public static synthetic fun markLayers$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/util/List;ILjava/lang/Object;)V +} + diff --git a/visionforge-markdown/api/visionforge-markdown.api b/visionforge-markdown/api/visionforge-markdown.api new file mode 100644 index 00000000..08028532 --- /dev/null +++ b/visionforge-markdown/api/visionforge-markdown.api @@ -0,0 +1,40 @@ +public final class space/kscience/visionforge/markup/MarkdownKt { + public static final fun markdown (Lkotlinx/html/TagConsumer;Lorg/intellij/markdown/flavours/MarkdownFlavourDescriptor;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; + public static synthetic fun markdown$default (Lkotlinx/html/TagConsumer;Lorg/intellij/markdown/flavours/MarkdownFlavourDescriptor;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup : space/kscience/visionforge/VisionBase { + public static final field COMMONMARK_FORMAT Ljava/lang/String; + public static final field Companion Lspace/kscience/visionforge/markup/VisionOfMarkup$Companion; + public static final field GFM_FORMAT Ljava/lang/String; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getContent ()Ljava/lang/String; + public final fun getFormat ()Ljava/lang/String; + public final fun setContent (Ljava/lang/String;)V + public static final fun write$Self (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/markup/VisionOfMarkup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/markup/VisionOfMarkup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/markup/VisionOfMarkup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup$Companion { + public final fun getCONTENT_PROPERTY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkupKt { + public static final fun content (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlin/jvm/functions/Function0;)V +} + diff --git a/visionforge-plotly/api/visionforge-plotly.api b/visionforge-plotly/api/visionforge-plotly.api new file mode 100644 index 00000000..273f3123 --- /dev/null +++ b/visionforge-plotly/api/visionforge-plotly.api @@ -0,0 +1,42 @@ +public final class space/kscience/visionforge/plotly/PlotlyPlugin : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/plotly/PlotlyPlugin$Companion; + public fun ()V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/plotly/PlotlyPlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/plotly/PlotlyPlugin; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly : space/kscience/visionforge/VisionBase { + public static final field Companion Lspace/kscience/visionforge/plotly/VisionOfPlotly$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/plotly/Plot;)V + public final fun getPlot ()Lspace/kscience/plotly/Plot; + public static final fun write$Self (Lspace/kscience/visionforge/plotly/VisionOfPlotly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/plotly/VisionOfPlotly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/plotly/VisionOfPlotly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotlyKt { + public static final fun asVision (Lspace/kscience/plotly/Plot;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public static final fun plotly (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; +} + diff --git a/visionforge-server/api/visionforge-server.api b/visionforge-server/api/visionforge-server.api new file mode 100644 index 00000000..3446765b --- /dev/null +++ b/visionforge-server/api/visionforge-server.api @@ -0,0 +1,36 @@ +public final class space/kscience/visionforge/server/VisionServer : space/kscience/dataforge/meta/Configurable { + public static final field Companion Lspace/kscience/visionforge/server/VisionServer$Companion; + public static final field DEFAULT_PAGE Ljava/lang/String; + public static final field DEFAULT_PORT I + public final fun getApplication ()Lio/ktor/application/Application; + public final fun getCacheFragments ()Z + public final fun getDataEmbed ()Z + public final fun getDataFetch ()Z + public final fun getDataUpdate ()Z + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public final fun getUpdateInterval ()J + public final fun page (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun page$default (Lspace/kscience/visionforge/server/VisionServer;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public final fun serveVisions (Ljava/lang/String;Ljava/util/Map;)V + public final fun serveVisionsFromFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; + public final fun setCacheFragments (Z)V + public final fun setDataEmbed (Z)V + public final fun setDataFetch (Z)V + public final fun setDataUpdate (Z)V + public final fun setUpdateInterval (J)V +} + +public final class space/kscience/visionforge/server/VisionServer$Companion { + public final fun getUPDATE_INTERVAL_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/server/VisionServerKt { + public static final fun close (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun openInBrowser (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun serve (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Lio/ktor/server/engine/ApplicationEngine; + public static synthetic fun serve$default (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/ktor/server/engine/ApplicationEngine; + public static final fun visionServer (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;)Lspace/kscience/visionforge/server/VisionServer; + public static synthetic fun visionServer$default (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/server/VisionServer; +} + diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api new file mode 100644 index 00000000..34c11260 --- /dev/null +++ b/visionforge-solid/api/visionforge-solid.api @@ -0,0 +1,996 @@ +public final class space/kscience/visionforge/solid/Box : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { + public static final field Companion Lspace/kscience/visionforge/solid/Box$Companion; + public fun (FFF)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getXSize ()F + public final fun getYSize ()F + public final fun getZSize ()F + public static final fun write$Self (Lspace/kscience/visionforge/solid/Box;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Box$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Box$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Box; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Box;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Box$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ColorAccessor : space/kscience/dataforge/values/MutableValueProvider { + public fun (Lspace/kscience/dataforge/values/MutableValueProvider;Lspace/kscience/dataforge/names/Name;)V + public final fun getValue ()Lspace/kscience/dataforge/values/Value; + public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; + public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/values/Value;)V + public final fun setValue (Lspace/kscience/dataforge/values/Value;)V +} + +public final class space/kscience/visionforge/solid/ColorAccessorKt { + public static final fun clear (Lspace/kscience/visionforge/solid/ColorAccessor;)V + public static final fun getString (Lspace/kscience/visionforge/solid/ColorAccessor;)Ljava/lang/String; + public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;I)V + public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V + public static final fun invoke-SGtJIdY (Lspace/kscience/visionforge/solid/ColorAccessor;BBB)V + public static final fun setString (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/Composite : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/Composite$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;)V + public final fun getCompositeType ()Lspace/kscience/visionforge/solid/CompositeType; + public final fun getFirst ()Lspace/kscience/visionforge/solid/Solid; + public final fun getSecond ()Lspace/kscience/visionforge/solid/Solid; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Composite;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Composite$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Composite$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Composite; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Composite;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Composite$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/CompositeKt { + public static final fun composite (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun composite$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun intersect (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun intersect$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun smartComposite (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Solid; + public static synthetic fun smartComposite$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Solid; + public static final fun subtract (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun subtract$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun union (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun union$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; +} + +public final class space/kscience/visionforge/solid/CompositeType : java/lang/Enum { + public static final field GROUP Lspace/kscience/visionforge/solid/CompositeType; + public static final field INTERSECT Lspace/kscience/visionforge/solid/CompositeType; + public static final field SUBTRACT Lspace/kscience/visionforge/solid/CompositeType; + public static final field UNION Lspace/kscience/visionforge/solid/CompositeType; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/CompositeType; + public static fun values ()[Lspace/kscience/visionforge/solid/CompositeType; +} + +public final class space/kscience/visionforge/solid/ConeSegment : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/ConeSegment$Companion; + public fun (FFFFF)V + public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getAngle ()F + public final fun getBottomRadius ()F + public final fun getHeight ()F + public final fun getStartAngle ()F + public final fun getTopRadius ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSegment;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/ConeSegment$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSegment$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSegment; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/ConeSegment;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSegment$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSegmentKt { + public static final fun cone (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cone$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; + public static final fun cylinder (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cylinder$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; +} + +public final class space/kscience/visionforge/solid/ConeSurface : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/ConeSurface$Companion; + public fun (FFFFFFF)V + public synthetic fun (FFFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getAngle ()F + public final fun getBottomInnerRadius ()F + public final fun getBottomRadius ()F + public final fun getHeight ()F + public final fun getStartAngle ()F + public final fun getTopInnerRadius ()F + public final fun getTopRadius ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSurface;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/ConeSurface$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSurface$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSurface; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/ConeSurface;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSurface$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSurfaceKt { + public static final fun coneSurface (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun coneSurface$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; + public static final fun tube (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun tube$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; +} + +public final class space/kscience/visionforge/solid/Convex : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/Convex$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getPoints ()Ljava/util/List; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Convex;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Convex$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Convex$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Convex; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Convex;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Convex$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConvexBuilder { + public fun ()V + public final fun build ()Lspace/kscience/visionforge/solid/Convex; + public final fun point (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/ConvexKt { + public static final fun convex (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Convex; + public static synthetic fun convex$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Convex; +} + +public final class space/kscience/visionforge/solid/ExtrudeBuilder : space/kscience/visionforge/SimpleVisionPropertyContainer { + public fun ()V + public fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLayers ()Ljava/util/List; + public final fun getShape ()Ljava/util/List; + public final fun layer (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V + public static synthetic fun layer$default (Lspace/kscience/visionforge/solid/ExtrudeBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;ILjava/lang/Object;)V + public final fun setLayers (Ljava/util/List;)V + public final fun setShape (Ljava/util/List;)V + public final fun shape (Lkotlin/jvm/functions/Function1;)V +} + +public final class space/kscience/visionforge/solid/Extruded : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/Extruded$Companion; + public static final field TYPE Ljava/lang/String; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;Ljava/util/List;)V + public final fun getLayers ()Ljava/util/List; + public final fun getShape ()Ljava/util/List; + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Extruded;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Extruded$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Extruded$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Extruded; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Extruded;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Extruded$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ExtrudedKt { + public static final fun extruded (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Extruded; + public static synthetic fun extruded$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Extruded; + public static final fun polygon (Lspace/kscience/visionforge/solid/Shape2DBuilder;ILjava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/GenericHexagon : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { + public static final field Companion Lspace/kscience/visionforge/solid/GenericHexagon$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)V + public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public static final fun write$Self (Lspace/kscience/visionforge/solid/GenericHexagon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/GenericHexagon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/GenericHexagon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/GenericHexagon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/GenericHexagon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/GenericHexagon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/GeometryBuilder { + public abstract fun build ()Ljava/lang/Object; + public abstract fun face (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/solid/GeometryBuilderKt { + public static final fun cap (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;)V + public static synthetic fun cap$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;ILjava/lang/Object;)V + public static final fun face4 (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face4$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/solid/GeometryKt { + public static final field PI2 F + public static final fun Point2D (Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point2D; + public static final fun Point3D (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun cross (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun minus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun normalizeInPlace (Lspace/kscience/visionforge/solid/MutablePoint3D;)V + public static final fun plus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Point2D;)Lspace/kscience/dataforge/meta/Meta; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/dataforge/meta/Meta; + public static final fun unaryMinus (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; +} + +public abstract interface class space/kscience/visionforge/solid/GeometrySolid : space/kscience/visionforge/solid/Solid { + public abstract fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V +} + +public abstract interface class space/kscience/visionforge/solid/Hexagon : space/kscience/visionforge/solid/GeometrySolid { + public abstract fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V +} + +public final class space/kscience/visionforge/solid/HexagonKt { + public static final fun box (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Box; + public static synthetic fun box$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Box; + public static final fun hexagon (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Hexagon; + public static synthetic fun hexagon$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Hexagon; +} + +public final class space/kscience/visionforge/solid/Layer { + public static final field Companion Lspace/kscience/visionforge/solid/Layer$Companion; + public fun (FFFF)V + public synthetic fun (IFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun component1 ()F + public final fun component2 ()F + public final fun component3 ()F + public final fun component4 ()F + public final fun copy (FFFF)Lspace/kscience/visionforge/solid/Layer; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Layer;FFFFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Layer; + public fun equals (Ljava/lang/Object;)Z + public final fun getScale ()F + public final fun getX ()F + public final fun getY ()F + public final fun getZ ()F + public fun hashCode ()I + public final fun setScale (F)V + public final fun setX (F)V + public final fun setY (F)V + public final fun setZ (F)V + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Layer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Layer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Layer$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Layer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Layer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Layer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/MutablePoint3D : space/kscience/visionforge/solid/Point3D { + public abstract fun getX ()F + public abstract fun getY ()F + public abstract fun getZ ()F + public abstract fun setX (F)V + public abstract fun setY (F)V + public abstract fun setZ (F)V +} + +public final class space/kscience/visionforge/solid/Point2D { + public static final field Companion Lspace/kscience/visionforge/solid/Point2D$Companion; + public fun (FF)V + public synthetic fun (IFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun component1 ()F + public final fun component2 ()F + public final fun copy (FF)Lspace/kscience/visionforge/solid/Point2D; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Point2D;FFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Point2D; + public fun equals (Ljava/lang/Object;)Z + public final fun getX ()F + public final fun getY ()F + public fun hashCode ()I + public final fun setX (F)V + public final fun setY (F)V + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Point2D;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Point2D$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Point2D$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Point2D; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Point2D;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Point2D$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/Point3D { + public static final field Companion Lspace/kscience/visionforge/solid/Point3D$Companion; + public abstract fun getX ()F + public abstract fun getY ()F + public abstract fun getZ ()F +} + +public final class space/kscience/visionforge/solid/Point3D$Companion { + public final fun getONE ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getZERO ()Lspace/kscience/visionforge/solid/Point3D; +} + +public final class space/kscience/visionforge/solid/PolyLine : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/PolyLine$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getPoints ()Ljava/util/List; + public final fun getThickness ()Ljava/lang/Number; + public final fun setThickness (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/PolyLine;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/PolyLine$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/PolyLine$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/PolyLine; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/PolyLine;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PolyLine$Companion { + public final fun getTHICKNESS_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PolyLineKt { + public static final fun polyline (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/PolyLine; + public static synthetic fun polyline$default (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/PolyLine; +} + +public abstract interface class space/kscience/visionforge/solid/PrototypeHolder { + public abstract fun getPrototype (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; + public abstract fun prototypes (Lkotlin/jvm/functions/Function1;)V +} + +public final class space/kscience/visionforge/solid/Quaternion { + public static final synthetic fun box-impl ([D)Lspace/kscience/visionforge/solid/Quaternion; + public static fun constructor-impl ([D)[D + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl ([DLjava/lang/Object;)Z + public static final fun equals-impl0 ([D[D)Z + public final fun getValues ()[D + public fun hashCode ()I + public static fun hashCode-impl ([D)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl ([D)Ljava/lang/String; + public final synthetic fun unbox-impl ()[D +} + +public final class space/kscience/visionforge/solid/QuaternionKt { + public static final fun component1-VMqeIco ([D)D + public static final fun component2-VMqeIco ([D)D + public static final fun component3-VMqeIco ([D)D + public static final fun component4-VMqeIco ([D)D +} + +public final class space/kscience/visionforge/solid/RotationOrder : java/lang/Enum { + public static final field XYZ Lspace/kscience/visionforge/solid/RotationOrder; + public static final field XZY Lspace/kscience/visionforge/solid/RotationOrder; + public static final field YXZ Lspace/kscience/visionforge/solid/RotationOrder; + public static final field YZX Lspace/kscience/visionforge/solid/RotationOrder; + public static final field ZXY Lspace/kscience/visionforge/solid/RotationOrder; + public static final field ZYX Lspace/kscience/visionforge/solid/RotationOrder; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/RotationOrder; + public static fun values ()[Lspace/kscience/visionforge/solid/RotationOrder; +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder { + public static final field Companion Lspace/kscience/visionforge/solid/Shape2DBuilder$Companion; + public fun ()V + public synthetic fun (ILjava/util/ArrayList;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/ArrayList;)V + public synthetic fun (Ljava/util/ArrayList;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun build ()Ljava/util/List; + public final fun point (Ljava/lang/Number;Ljava/lang/Number;)V + public final fun to (Ljava/lang/Number;Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Shape2DBuilder;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Shape2DBuilder$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Shape2DBuilder; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Shape2DBuilder;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/Solid : space/kscience/visionforge/Vision { + public static final field Companion Lspace/kscience/visionforge/solid/Solid$Companion; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/Solid$Companion { + public final fun getDETAIL_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getGEOMETRY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getIGNORE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getLAYER_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getPOSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getROTATION_ORDER_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getSCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public class space/kscience/visionforge/solid/SolidBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/solid/Solid { + public static final field Companion Lspace/kscience/visionforge/solid/SolidBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidBase$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroup : space/kscience/visionforge/VisionGroupBase, space/kscience/visionforge/solid/PrototypeHolder, space/kscience/visionforge/solid/Solid { + public static final field Companion Lspace/kscience/visionforge/solid/SolidGroup$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public synthetic fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; + public fun getChildren ()Ljava/util/Map; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getPrototype (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; + public fun prototypes (Lkotlin/jvm/functions/Function1;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidGroup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidGroup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidGroup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroup$Companion { + public final fun getPROTOTYPES_TOKEN ()Lspace/kscience/dataforge/names/NameToken; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroupKt { + public static final fun SolidGroup (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/solid/SolidKt { + public static final fun getDetail (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Integer; + public static final fun getIgnore (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; + public static final fun getLayer (Lspace/kscience/visionforge/solid/Solid;)I + public static final fun getPosition (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getRotation (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getRotationOrder (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/RotationOrder; + public static final fun getRotationX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getRotationY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getRotationZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScale (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getScaleX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScaleY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScaleZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun setDetail (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Integer;)V + public static final fun setIgnore (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V + public static final fun setLayer (Lspace/kscience/visionforge/solid/Solid;I)V + public static final fun setPosition (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setRotation (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setRotationOrder (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/RotationOrder;)V + public static final fun setRotationX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setRotationY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setRotationZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScale (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setScaleX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScaleY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScaleZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/SolidLabel : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/SolidLabel$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;DLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;DLjava/lang/String;)V + public final fun getFontFamily ()Ljava/lang/String; + public final fun getFontSize ()D + public final fun getText ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidLabel;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidLabel$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidLabel$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidLabel; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidLabel;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidLabel$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidLabelKt { + public static final fun label (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidLabel; + public static synthetic fun label$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidLabel; +} + +public final class space/kscience/visionforge/solid/SolidMaterial : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/SolidMaterial$Companion; + public fun ()V + public final fun getColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getEmissiveColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getOpacity ()F + public final fun getSpecularColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getWireframe ()Z + public final fun setOpacity (F)V + public final fun setWireframe (Z)V +} + +public final class space/kscience/visionforge/solid/SolidMaterial$Companion : space/kscience/dataforge/meta/SchemeSpec { + public final fun getCOLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getMATERIAL_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_OPACITY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_SPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_WIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getOPACITY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getSPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getWIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/solid/SolidMaterialKt { + public static final fun getColor (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/ColorAccessor; + public static final fun getMaterial (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/SolidMaterial; + public static final fun getOpacity (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun material (Lspace/kscience/visionforge/solid/Solid;Lkotlin/jvm/functions/Function1;)V + public static final fun setMaterial (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/SolidMaterial;)V + public static final fun setOpacity (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V +} + +public abstract interface class space/kscience/visionforge/solid/SolidReference : space/kscience/visionforge/VisionGroup { + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public abstract fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup : space/kscience/visionforge/VisionBase, space/kscience/visionforge/VisionGroup, space/kscience/visionforge/solid/Solid, space/kscience/visionforge/solid/SolidReference { + public static final field Companion Lspace/kscience/visionforge/solid/SolidReferenceGroup$Companion; + public static final field REFERENCE_CHILD_PROPERTY_PREFIX Ljava/lang/String; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/dataforge/names/Name;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/dataforge/names/Name;)V + public fun getChildren ()Ljava/util/Map; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; + public final fun getRefName ()Lspace/kscience/dataforge/names/Name; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidReferenceGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidReferenceGroup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidReferenceGroup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidReferenceKt { + public static final fun getUnref (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/solid/Solid; + public static final fun newRef (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun newRef$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; +} + +public final class space/kscience/visionforge/solid/Solids : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/solid/Solids$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/solid/Solids$Companion : space/kscience/dataforge/context/PluginFactory { + public final fun decodeFromString (Ljava/lang/String;)Lspace/kscience/visionforge/solid/Solid; + public final fun encodeToString (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/String; + public final fun getSerializersModuleForSolids ()Lkotlinx/serialization/modules/SerializersModule; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/solid/Solids; +} + +public final class space/kscience/visionforge/solid/SolidsKt { + public static final fun solid (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/solid/Sphere : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/Sphere$Companion; + public fun (FFFFF)V + public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getPhi ()F + public final fun getPhiStart ()F + public final fun getRadius ()F + public final fun getTheta ()F + public final fun getThetaStart ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Sphere;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Sphere$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Sphere$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Sphere; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Sphere;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Sphere$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereKt { + public static final fun sphere (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Sphere; + public static synthetic fun sphere$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Sphere; +} + +public final class space/kscience/visionforge/solid/SphereLayer : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/SphereLayer$Companion; + public fun (FFFFFF)V + public synthetic fun (FFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getInnerRadius ()F + public final fun getOuterRadius ()F + public final fun getPhi ()F + public final fun getPhiStart ()F + public final fun getTheta ()F + public final fun getThetaStart ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/SphereLayer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SphereLayer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SphereLayer$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SphereLayer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SphereLayer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereLayer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereLayerKt { + public static final fun sphereLayer (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SphereLayer; + public static synthetic fun sphereLayer$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SphereLayer; +} + +public final class space/kscience/visionforge/solid/specifications/Axes : space/kscience/dataforge/meta/Scheme { + public static final field AXIS_SIZE D + public static final field AXIS_WIDTH D + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Axes$Companion; + public fun ()V + public final fun getSize ()D + public final fun getVisible ()Z + public final fun getWidth ()D + public final fun setSize (D)V + public final fun setVisible (Z)V + public final fun setWidth (D)V +} + +public final class space/kscience/visionforge/solid/specifications/Axes$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Camera : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Camera$Companion; + public static final field FAR_CLIP D + public static final field FIELD_OF_VIEW I + public static final field INITIAL_AZIMUTH D + public static final field INITIAL_DISTANCE D + public static final field INITIAL_LATITUDE D + public static final field NEAR_CLIP D + public fun ()V + public final fun getAzimuth ()D + public final fun getDistance ()D + public final fun getFarClip ()D + public final fun getFov ()I + public final fun getLatitude ()D + public final fun getNearClip ()D + public final fun setAzimuth (D)V + public final fun setDistance (D)V + public final fun setFarClip (D)V + public final fun setFov (I)V + public final fun setLatitude (D)V + public final fun setNearClip (D)V +} + +public final class space/kscience/visionforge/solid/specifications/Camera$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/CameraKt { + public static final fun getZenith (Lspace/kscience/visionforge/solid/specifications/Camera;)D +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion; + public fun ()V + public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/Axes; + public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/Camera; + public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/Clipping; + public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/Controls; + public final fun getLayers ()Ljava/util/List; + public final fun getLight ()Lspace/kscience/visionforge/solid/specifications/Light; + public final fun getOnSelect ()Lkotlin/jvm/functions/Function1; + public final fun getSize ()Lspace/kscience/visionforge/solid/specifications/CanvasSize; + public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/Axes;)V + public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/Camera;)V + public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/Clipping;)V + public final fun setControls (Lspace/kscience/visionforge/solid/specifications/Controls;)V + public final fun setLayers (Ljava/util/List;)V + public final fun setLight (Lspace/kscience/visionforge/solid/specifications/Light;)V + public final fun setOnSelect (Lkotlin/jvm/functions/Function1;)V + public final fun setSize (Lspace/kscience/visionforge/solid/specifications/CanvasSize;)V +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptionsKt { + public static final fun computeHeight (Lspace/kscience/visionforge/solid/specifications/CanvasSize;Ljava/lang/Number;)I + public static final fun computeWidth (Lspace/kscience/visionforge/solid/specifications/CanvasSize;Ljava/lang/Number;)I +} + +public final class space/kscience/visionforge/solid/specifications/CanvasSize : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/CanvasSize$Companion; + public fun ()V + public final fun getMaxHeight ()Ljava/lang/Number; + public final fun getMaxSize ()I + public final fun getMaxWith ()Ljava/lang/Number; + public final fun getMinHeight ()Ljava/lang/Number; + public final fun getMinSize ()I + public final fun getMinWith ()Ljava/lang/Number; + public final fun setMaxHeight (Ljava/lang/Number;)V + public final fun setMaxSize (I)V + public final fun setMaxWith (Ljava/lang/Number;)V + public final fun setMinHeight (Ljava/lang/Number;)V + public final fun setMinSize (I)V + public final fun setMinWith (Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/specifications/CanvasSize$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Clipping : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Clipping$Companion; + public fun ()V + public final fun getX ()Ljava/lang/Double; + public final fun getY ()Ljava/lang/Double; + public final fun getZ ()Ljava/lang/Double; + public final fun setX (Ljava/lang/Double;)V + public final fun setY (Ljava/lang/Double;)V + public final fun setZ (Ljava/lang/Double;)V +} + +public final class space/kscience/visionforge/solid/specifications/Clipping$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Controls : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Controls$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/specifications/Controls$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public final class space/kscience/visionforge/solid/specifications/Light : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Light$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/specifications/Light$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public abstract class space/kscience/visionforge/solid/transform/VisualTreeTransform { + public fun ()V + protected abstract fun clone (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/Vision; + public final fun invoke (Lspace/kscience/visionforge/Vision;Z)Lspace/kscience/visionforge/Vision; + public static synthetic fun invoke$default (Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;Lspace/kscience/visionforge/Vision;ZILjava/lang/Object;)Lspace/kscience/visionforge/Vision; + protected abstract fun transformInPlace (Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/solid/transform/VisualTreeTransformKt { + public static final fun transform (Lspace/kscience/visionforge/Vision;[Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;)Lspace/kscience/visionforge/Vision; + public static final fun transformInPlace (Lspace/kscience/visionforge/Vision;[Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;)V +} + diff --git a/visionforge-tables/api/visionforge-tables.api b/visionforge-tables/api/visionforge-tables.api new file mode 100644 index 00000000..3a4af1fb --- /dev/null +++ b/visionforge-tables/api/visionforge-tables.api @@ -0,0 +1,63 @@ +public final class space/kscience/visionforge/tables/ColumnHeaderScheme : space/kscience/dataforge/meta/Scheme, space/kscience/tables/ColumnHeader { + public static final field Companion Lspace/kscience/visionforge/tables/ColumnHeaderScheme$Companion; + public fun ()V + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun getName ()Ljava/lang/String; + public final fun getProperties ()Lspace/kscience/tables/ValueColumnScheme; + public fun getType ()Lkotlin/reflect/KType; + public fun setName (Ljava/lang/String;)V + public final fun setProperties (Lspace/kscience/tables/ValueColumnScheme;)V +} + +public final class space/kscience/visionforge/tables/ColumnHeaderScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public final class space/kscience/visionforge/tables/TablePlugin : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/tables/TablePlugin$Companion; + public fun ()V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/tables/TablePlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/tables/TablePlugin; +} + +public final class space/kscience/visionforge/tables/VisionOfTable : space/kscience/visionforge/VisionBase, space/kscience/tables/Rows { + public static final field Companion Lspace/kscience/visionforge/tables/VisionOfTable$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getData ()Lspace/kscience/dataforge/values/Value; + public fun getHeaders ()Ljava/util/List; + public fun rowSequence ()Lkotlin/sequences/Sequence; + public final fun setData (Lspace/kscience/dataforge/values/Value;)V + public fun setHeaders (Ljava/util/List;)V + public static final fun write$Self (Lspace/kscience/visionforge/tables/VisionOfTable;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/tables/VisionOfTable$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/tables/VisionOfTable$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/tables/VisionOfTable; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/tables/VisionOfTable;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/tables/VisionOfTable$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/tables/VisionOfTableKt { + public static final fun numberTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun stringTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun table (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun toVision (Lspace/kscience/tables/Table;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun valueTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; +} + diff --git a/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api new file mode 100644 index 00000000..d2d708d9 --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api @@ -0,0 +1,6 @@ +public final class space/kscience/visionforge/three/ServerExtensionsKt { + public static final fun getThreeJsHeader (Lspace/kscience/visionforge/html/Page$Companion;)Lkotlin/jvm/functions/Function1; + public static final fun makeThreeJsFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun makeThreeJsFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + -- 2.34.1 From d504943295cd7384ff0201376fe1df68437d1cb1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 23 Jan 2022 15:06:47 +0300 Subject: [PATCH 066/143] Update readmes --- CHANGELOG.md | 20 +++ README.md | 159 +++++++++++++++++- cern-root-loader/README.md | 4 + demo/README.md | 4 + demo/gdml/README.md | 11 +- demo/js-playground/README.md | 4 + demo/muon-monitor/README.md | 31 +--- demo/playground/README.md | 4 + .../src/jvmMain/kotlin/gdmlCurve.kt | 2 + demo/plotly-fx/README.md | 4 + demo/sat-demo/README.md | 4 + demo/solid-showcase/README.md | 17 +- docs/templates/ARTIFACT-TEMPLATE.md | 11 -- docs/templates/README-TEMPLATE.md | 17 +- gradle.properties | 2 +- jupyter/README.md | 4 + jupyter/visionforge-jupyter-gdml/README.md | 32 ++++ settings.gradle.kts | 2 +- ui/README.md | 4 + ui/bootstrap/README.md | 4 + ui/react/README.md | 4 + ui/ring/README.md | 4 + visionforge-core/README.md | 32 ++++ visionforge-fx/README.md | 32 ++++ visionforge-gdml/README.md | 32 ++++ visionforge-markdown/README.md | 32 ++++ visionforge-plotly/README.md | 32 ++++ visionforge-server/README.md | 32 ++++ visionforge-solid/README.md | 32 ++++ visionforge-tables/README.md | 32 ++++ visionforge-threejs/README.md | 32 ++++ .../visionforge-threejs-server/README.md | 32 ++++ 32 files changed, 594 insertions(+), 74 deletions(-) create mode 100644 cern-root-loader/README.md create mode 100644 demo/README.md create mode 100644 demo/js-playground/README.md create mode 100644 demo/playground/README.md create mode 100644 demo/plotly-fx/README.md create mode 100644 demo/sat-demo/README.md create mode 100644 jupyter/README.md create mode 100644 jupyter/visionforge-jupyter-gdml/README.md create mode 100644 ui/README.md create mode 100644 ui/bootstrap/README.md create mode 100644 ui/react/README.md create mode 100644 ui/ring/README.md create mode 100644 visionforge-core/README.md create mode 100644 visionforge-fx/README.md create mode 100644 visionforge-gdml/README.md create mode 100644 visionforge-markdown/README.md create mode 100644 visionforge-plotly/README.md create mode 100644 visionforge-server/README.md create mode 100644 visionforge-solid/README.md create mode 100644 visionforge-tables/README.md create mode 100644 visionforge-threejs/README.md create mode 100644 visionforge-threejs/visionforge-threejs-server/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index d638f0c8..2ffcb3c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## [Unreleased] ### Added + +### Changed + +### Deprecated + +### Removed + +### Fixed + +### Security + +## [0.2.0] +### Added - Server module - Change collector - Customizable accessors for colors @@ -9,6 +22,9 @@ - Hexagon interface and GenericHexagon implementation (Box inherits Hexagon) - Increased the default detail level for spheres and cones to 32 - Simple clipping for Solids in ThreeJs +- Markdown module +- Tables module + ### Changed - Vision does not implement ItemProvider anymore. Property changes are done via `getProperty`/`setProperty` and `property` delegate. @@ -25,12 +41,16 @@ - Property listeners are not triggered if there are no changes. - Feedback websocket connection in the client. + ### Deprecated ### Removed - Primary modules dependencies on UI + ### Fixed - Version conflicts + ### Security + diff --git a/README.md b/README.md index 6a77447e..eeeaab9e 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ * [Modules contained in this repository](#modules-contained-in-this-repository) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Solid Showcase](#simple-example---solid-showcase) - * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) - * [GDML Example](#gdml-example) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) ## Introduction @@ -61,7 +61,158 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository -$modules +
+ +* ### [cern-root-loader](cern-root-loader) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [demo](demo) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [jupyter](jupyter) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [ui](ui) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-core](visionforge-core) +> +> +> **Maturity**: DEVELOPMENT +
+ +* ### [visionforge-fx](visionforge-fx) +> +> +> **Maturity**: PROTOTYPE +
+ +* ### [visionforge-gdml](visionforge-gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-markdown](visionforge-markdown) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-plotly](visionforge-plotly) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-server](visionforge-server) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-solid](visionforge-solid) +> +> +> **Maturity**: DEVELOPMENT +
+ +* ### [visionforge-tables](visionforge-tables) +> +> +> **Maturity**: PROTOTYPE +
+ +* ### [visionforge-threejs](visionforge-threejs) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [gdml](demo/gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [js-playground](demo/js-playground) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [muon-monitor](demo/muon-monitor) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [playground](demo/playground) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [plotly-fx](demo/plotly-fx) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [sat-demo](demo/sat-demo) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [solid-showcase](demo/solid-showcase) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-jupyter-gdml](jupyter/visionforge-jupyter-gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [bootstrap](ui/bootstrap) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [react](ui/react) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [ring](ui/ring) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-threejs-server](visionforge-threejs/visionforge-threejs-server) +> +> +> **Maturity**: EXPERIMENTAL +
+ **Class diagram:** diff --git a/cern-root-loader/README.md b/cern-root-loader/README.md new file mode 100644 index 00000000..b032852d --- /dev/null +++ b/cern-root-loader/README.md @@ -0,0 +1,4 @@ +# Module cern-root-loader + + + diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 00000000..e2a13c47 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,4 @@ +# Module demo + + + diff --git a/demo/gdml/README.md b/demo/gdml/README.md index 5c2a5abe..b9de634c 100644 --- a/demo/gdml/README.md +++ b/demo/gdml/README.md @@ -1,13 +1,4 @@ -### GDML Example +# Module gdml -Visualization example for geometry defined as GDML file. -##### Building project -To build the app, run `demo/gdml/Tasks/kotlin browser/jsBrowserDistribution` Gradle task, then -drag-and-drop GDML file to the window to see visualization. For an example file, you can use -`demo/gdml/src/jsMain/resources/cubes.gdml`. - -##### Example view: - -![](../../docs/images/gdml-demo.png) diff --git a/demo/js-playground/README.md b/demo/js-playground/README.md new file mode 100644 index 00000000..6b899a57 --- /dev/null +++ b/demo/js-playground/README.md @@ -0,0 +1,4 @@ +# Module js-playground + + + diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md index df95c968..74c935e4 100644 --- a/demo/muon-monitor/README.md +++ b/demo/muon-monitor/README.md @@ -1,33 +1,4 @@ +# Module muon-monitor -### Muon Monitor Visualization -This directory contains a full-stack application example built with `visionforge`. -It is visualizing the -[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up, -including experiment's geometry and events (particle tracks). -#### Reusing code and going Full-Stack with Kotlin Multiplatform - -The application includes both server back-end generating events, as well as client -visualization front-end. - -As is common for Kotlin multiplatform projects, the code base of this simple application -is put in the following main directories: -* `commonMain` - common code, used by both JS client and JVM server. For example, the `Monitor` -object describes general geometry definitions needed in all parts of the application. -* `jsMain` - JavaScript client code. It performs visualization and reads events from the server. -* `jvmMain` - JVM server code. It runs `ktor` HTTP server, responding with event data when -client requests them. - -Note that in a more traditional approach when client and server are developed separately -and possibly using different languages, there would be no common code and benefits associated -with it. - -##### Building project - -To run full-stack Muon Monitor Visualization application (both JVM server and Web browser front-end), -run `demo/muon-monitor/Tasks/application/run` task. - -##### Example view: - -![](../../docs/images/muon-monitor.png) diff --git a/demo/playground/README.md b/demo/playground/README.md new file mode 100644 index 00000000..d2c8bc02 --- /dev/null +++ b/demo/playground/README.md @@ -0,0 +1,4 @@ +# Module playground + + + diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 81facd71..70827a2d 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -1,3 +1,5 @@ +@file:Suppress("UNUSED_VARIABLE") + package space.kscience.visionforge.examples import space.kscience.gdml.* diff --git a/demo/plotly-fx/README.md b/demo/plotly-fx/README.md new file mode 100644 index 00000000..d8679f77 --- /dev/null +++ b/demo/plotly-fx/README.md @@ -0,0 +1,4 @@ +# Module plotly-fx + + + diff --git a/demo/sat-demo/README.md b/demo/sat-demo/README.md new file mode 100644 index 00000000..ea15abe0 --- /dev/null +++ b/demo/sat-demo/README.md @@ -0,0 +1,4 @@ +# Module sat-demo + + + diff --git a/demo/solid-showcase/README.md b/demo/solid-showcase/README.md index f8771e13..059597ef 100644 --- a/demo/solid-showcase/README.md +++ b/demo/solid-showcase/README.md @@ -1,19 +1,4 @@ -### Spatial Showcase +# Module solid-showcase -Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. -Some shapes will also periodically change their color and visibility. -##### Building project - -To see the JS demo: run `demo/solid-showcase/Tasks/kotlin browser/jsBrowserRun` Gradle task, then open -`build/distribuions/solid-showcase-js-0.1.3-dev/index.html` file in your browser. -To see Java FX demo, run `demo/spatial-showcase/Tasks/application/run` Gradle task, or `main()` from `FXDemoApp.kt`. - -##### Example view for JS: - -![](../../docs/images/spatial-showcase.png) - -##### Example view for Java FX: - -![](../../docs/images/spatial-showcase-FX.png) diff --git a/docs/templates/ARTIFACT-TEMPLATE.md b/docs/templates/ARTIFACT-TEMPLATE.md index 91e09096..5d397423 100644 --- a/docs/templates/ARTIFACT-TEMPLATE.md +++ b/docs/templates/ARTIFACT-TEMPLATE.md @@ -2,17 +2,6 @@ The Maven coordinates of this project are `${group}:${name}:${version}`. -**Gradle Groovy:** -```gradle -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation '${group}:${name}:${version}' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { diff --git a/docs/templates/README-TEMPLATE.md b/docs/templates/README-TEMPLATE.md index 775c2b12..04ab1752 100644 --- a/docs/templates/README-TEMPLATE.md +++ b/docs/templates/README-TEMPLATE.md @@ -61,7 +61,7 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository -$modules +${modules} **Class diagram:** @@ -132,6 +132,21 @@ Visualization example for geometry defined as GDML file. ![](docs/images/gdml-demo.png) +## Stability and documentation + +VisionForge is a modular library. Different modules provide different features with different API stability guarantees. All core modules are released with the same version, but with different API change policy. The features are described in module definitions below. The module stability could have the following levels: + +* **PROTOTYPE**. On this level there are no compatibility guarantees. All methods and classes form those modules could break any moment. You can still use it, but be sure to fix the specific version. +* **EXPERIMENTAL**. The general API is decided, but some changes could be made. Volatile API is marked + with `@DFExperimental` or other stability warning annotations. +* **DEVELOPMENT**. API breaking generally follows semantic versioning ideology. There could be changes in minor + versions, but not in patch versions. API is protected with [binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator) tool. +* **STABLE**. The API stabilized. Breaking changes are allowed only in major releases. + +Additionally, one should note that the VisionForge Json format impacts the reproducibility of stored vision fragments. There should not be any breaks of the format between major releases. All problems should be reported. + +The documentation for the project is a work in progress. Please report any issues with missing, vague or wrong information. The contributions into documentation are quite welcome. + ## Thanks and references The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. diff --git a/gradle.properties b/gradle.properties index fbaacb05..e89e285b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ org.gradle.parallel=true publishing.github=false publishing.sonatype=false -toolsVersion=0.10.9-kotlin-1.6.10 \ No newline at end of file +toolsVersion=0.11.0-kotlin-1.6.10 \ No newline at end of file diff --git a/jupyter/README.md b/jupyter/README.md new file mode 100644 index 00000000..433d3042 --- /dev/null +++ b/jupyter/README.md @@ -0,0 +1,4 @@ +# Module jupyter + +Common visionforge jupyter module + diff --git a/jupyter/visionforge-jupyter-gdml/README.md b/jupyter/visionforge-jupyter-gdml/README.md new file mode 100644 index 00000000..cae8af86 --- /dev/null +++ b/jupyter/visionforge-jupyter-gdml/README.md @@ -0,0 +1,32 @@ +# Module visionforge-jupyter-gdml + +Jupyter api artifact for GDML rendering + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-jupyter-gdml:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-jupyter-gdml:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-jupyter-gdml:0.2.0") +} +``` diff --git a/settings.gradle.kts b/settings.gradle.kts index 3ae9f6f9..9fe0138c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { val toolsVersion: String by extra repositories { - mavenLocal() + //mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 00000000..ec08d176 --- /dev/null +++ b/ui/README.md @@ -0,0 +1,4 @@ +# Module ui + + + diff --git a/ui/bootstrap/README.md b/ui/bootstrap/README.md new file mode 100644 index 00000000..0cc57002 --- /dev/null +++ b/ui/bootstrap/README.md @@ -0,0 +1,4 @@ +# Module bootstrap + + + diff --git a/ui/react/README.md b/ui/react/README.md new file mode 100644 index 00000000..9f862213 --- /dev/null +++ b/ui/react/README.md @@ -0,0 +1,4 @@ +# Module react + + + diff --git a/ui/ring/README.md b/ui/ring/README.md new file mode 100644 index 00000000..6cdcbb60 --- /dev/null +++ b/ui/ring/README.md @@ -0,0 +1,4 @@ +# Module ring + + + diff --git a/visionforge-core/README.md b/visionforge-core/README.md new file mode 100644 index 00000000..2f9e6889 --- /dev/null +++ b/visionforge-core/README.md @@ -0,0 +1,32 @@ +# Module visionforge-core + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-core:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-core:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-core:0.2.0") +} +``` diff --git a/visionforge-fx/README.md b/visionforge-fx/README.md new file mode 100644 index 00000000..2cef5e81 --- /dev/null +++ b/visionforge-fx/README.md @@ -0,0 +1,32 @@ +# Module visionforge-fx + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-fx:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-fx:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-fx:0.2.0") +} +``` diff --git a/visionforge-gdml/README.md b/visionforge-gdml/README.md new file mode 100644 index 00000000..135a369e --- /dev/null +++ b/visionforge-gdml/README.md @@ -0,0 +1,32 @@ +# Module visionforge-gdml + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-gdml:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-gdml:0.2.0") +} +``` diff --git a/visionforge-markdown/README.md b/visionforge-markdown/README.md new file mode 100644 index 00000000..f43c742b --- /dev/null +++ b/visionforge-markdown/README.md @@ -0,0 +1,32 @@ +# Module visionforge-markdown + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-markdown:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-markdown:0.2.0") +} +``` diff --git a/visionforge-plotly/README.md b/visionforge-plotly/README.md new file mode 100644 index 00000000..f8a03891 --- /dev/null +++ b/visionforge-plotly/README.md @@ -0,0 +1,32 @@ +# Module visionforge-plotly + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-plotly:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-plotly:0.2.0") +} +``` diff --git a/visionforge-server/README.md b/visionforge-server/README.md new file mode 100644 index 00000000..0ac4c198 --- /dev/null +++ b/visionforge-server/README.md @@ -0,0 +1,32 @@ +# Module visionforge-server + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-server:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-server:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-server:0.2.0") +} +``` diff --git a/visionforge-solid/README.md b/visionforge-solid/README.md new file mode 100644 index 00000000..cbf4073b --- /dev/null +++ b/visionforge-solid/README.md @@ -0,0 +1,32 @@ +# Module visionforge-solid + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-solid:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-solid:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-solid:0.2.0") +} +``` diff --git a/visionforge-tables/README.md b/visionforge-tables/README.md new file mode 100644 index 00000000..6cdbd356 --- /dev/null +++ b/visionforge-tables/README.md @@ -0,0 +1,32 @@ +# Module visionforge-tables + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-tables:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-tables:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-tables:0.2.0") +} +``` diff --git a/visionforge-threejs/README.md b/visionforge-threejs/README.md new file mode 100644 index 00000000..98c13b7a --- /dev/null +++ b/visionforge-threejs/README.md @@ -0,0 +1,32 @@ +# Module visionforge-threejs + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-threejs:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-threejs:0.2.0") +} +``` diff --git a/visionforge-threejs/visionforge-threejs-server/README.md b/visionforge-threejs/visionforge-threejs-server/README.md new file mode 100644 index 00000000..0b9d9e4e --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/README.md @@ -0,0 +1,32 @@ +# Module visionforge-threejs-server + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-threejs-server:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-threejs-server:0.2.0") +} +``` -- 2.34.1 From db5064f6ed15e713a2502c9d8f9a27d16a80f569 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 23 Jan 2022 15:56:46 +0300 Subject: [PATCH 067/143] 0.2.0 release --- gradle.properties | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e89e285b..e029eef4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ org.gradle.parallel=true publishing.github=false publishing.sonatype=false -toolsVersion=0.11.0-kotlin-1.6.10 \ No newline at end of file +toolsVersion=0.11.1-kotlin-1.6.10 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9fe0138c..3ae9f6f9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { val toolsVersion: String by extra repositories { - //mavenLocal() + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() -- 2.34.1 From f828f86e290f1a359c8b73a49337534ac3eb7cb3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 27 Jan 2022 12:10:00 +0300 Subject: [PATCH 068/143] Replace light model for 3ds --- CHANGELOG.md | 2 + build.gradle.kts | 2 +- .../src/main/kotlin/JsPlaygroundApp.kt | 7 +- .../src/main/kotlin/gravityDemo.kt | 12 ++- .../mipt/npm/muon/monitor/MMAppComponent.kt | 7 +- .../kscience/visionforge/solid/demo/demo.kt | 7 +- .../tutorial-solids.md} | 54 ++++++------- .../ThreeViewWithControls.kt | 4 + .../visionforge/solid/OrbitControls.kt | 2 +- .../kscience/visionforge/solid/LightSource.kt | 44 +++++++++++ .../kscience/visionforge/solid/SolidGroup.kt | 4 +- .../visionforge/solid/SolidMaterial.kt | 21 ++++- .../kscience/visionforge/solid/Solids.kt | 3 + .../specifications/{Axes.kt => AxesScheme.kt} | 10 +-- .../{Camera.kt => CameraScheme.kt} | 18 ++--- .../solid/specifications/Canvas3DOptions.kt | 69 +++++++--------- .../{Controls.kt => ControlsScheme.kt} | 4 +- .../visionforge/solid/specifications/Light.kt | 8 -- .../solid/specifications/PointScheme.kt | 19 +++++ .../visionforge/solid/SerializationTest.kt | 15 ++++ .../solid/three/MeshThreeFactory.kt | 2 + .../solid/three/ThreeAmbientLightFactory.kt | 19 +++++ .../visionforge/solid/three/ThreeCanvas.kt | 49 +++++++----- .../visionforge/solid/three/ThreeFactory.kt | 3 +- .../visionforge/solid/three/ThreeMaterials.kt | 78 ++++++++++++------- .../visionforge/solid/three/ThreePlugin.kt | 6 +- .../solid/three/ThreePointLightFactory.kt | 28 +++++++ 27 files changed, 340 insertions(+), 157 deletions(-) rename docs/{tutorial.md => tutorials/tutorial-solids.md} (91%) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt rename visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/{Axes.kt => AxesScheme.kt} (79%) rename visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/{Camera.kt => CameraScheme.kt} (77%) rename visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/{Controls.kt => ControlsScheme.kt} (56%) delete mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Light.kt create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/PointScheme.kt create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ffcb3c9..d2cf0882 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added ### Changed +- Naming of Canvas3D options +- Lights are added to the scene instead of 3D options ### Deprecated diff --git a/build.gradle.kts b/build.gradle.kts index 0f892c76..0cd9f7da 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ val fxVersion by extra("11") allprojects{ group = "space.kscience" - version = "0.2.0" + version = "0.2.1-dev-1" } subprojects { diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index a1ffa4ff..5e09911b 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,6 +1,5 @@ import kotlinx.browser.document import kotlinx.css.* -import react.child import react.dom.render import ringui.SmartTabs import ringui.Tab @@ -8,6 +7,7 @@ import space.kscience.dataforge.context.Context import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application +import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionClient import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeCanvasWithControls @@ -48,7 +48,7 @@ private class JsPlaygroundApp : Application { } SmartTabs("gravity") { Tab("gravity") { - GravityDemo{ + GravityDemo { attrs { this.context = playgroundContext } @@ -73,6 +73,9 @@ private class JsPlaygroundApp : Application { attrs { context = playgroundContext solid { + ambientLight { + color(Colors.white) + } repeat(100) { sphere(5, name = "sphere[$it]") { x = random.nextDouble(-300.0, 300.0) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index 716cc2c3..4d420cc7 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -7,6 +7,7 @@ import react.fc import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace +import space.kscience.visionforge.Colors import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls @@ -21,10 +22,10 @@ external interface DemoProps : Props { } val GravityDemo = fc { props -> - val velocityTrace = Trace{ + val velocityTrace = Trace { name = "velocity" } - val energyTrace = Trace{ + val energyTrace = Trace { name = "energy" } val markup = VisionOfMarkup() @@ -41,6 +42,11 @@ val GravityDemo = fc { props -> attrs { context = props.context solid { + pointLight(200, 200, 200, name = "light"){ + color(Colors.white) + } + ambientLight() + sphere(5.0, "ball") { detail = 16 color("red") @@ -91,7 +97,7 @@ val GravityDemo = fc { props -> height = 50.vh - 50.pt } plotly { - traces(velocityTrace,energyTrace) + traces(velocityTrace, energyTrace) layout { xaxis.title = "time" } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 558317cb..350d25f3 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -17,12 +17,13 @@ import react.fc import react.useMemo import react.useState import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab -import space.kscience.visionforge.solid.specifications.Camera +import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.edges import styled.css @@ -42,17 +43,19 @@ val MMApp = fc("Muon monitor") { props -> val mmOptions = useMemo { Canvas3DOptions { - camera = Camera { + camera { distance = 2100.0 latitude = PI / 6 azimuth = PI + PI / 6 } + } } val root = useMemo(props.model) { props.model.root.apply { edges() + ambientLight() } } diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index a0ab9273..5631de56 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -18,7 +18,11 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro val meta = Meta { "title" put title } - val vision = SolidGroup(block) + val vision = SolidGroup(block).apply { + ambientLight{ + color(Colors.white) + } + } render(Name.parse(name), vision, meta) } @@ -39,6 +43,7 @@ val canvasOptions = Canvas3DOptions { @OptIn(DelicateCoroutinesApi::class) fun VisionLayout.showcase() { demo("shapes", "Basic shapes") { + ambientLight() box(100.0, 100.0, 100.0) { z = -110.0 color("teal") diff --git a/docs/tutorial.md b/docs/tutorials/tutorial-solids.md similarity index 91% rename from docs/tutorial.md rename to docs/tutorials/tutorial-solids.md index 8989bd49..2b1e7b57 100644 --- a/docs/tutorial.md +++ b/docs/tutorials/tutorial-solids.md @@ -59,7 +59,7 @@ box(10, 10, 10, name = "small box"){ rotation = Point3D(0, 0, 0) } ``` -![](../docs/images/small-box.png) +![](../images/small-box.png) The `big box` will have properties with custom values. ```kotlin @@ -72,7 +72,7 @@ box(40, 40, 40, name = "big box"){ rotation = Point3D(60, 80, 0) } ``` -![](../docs/images/big-rotated-box.png) +![](../images/big-rotated-box.png) If we compare these boxes, we will see all differences. Here is the function `main` with both boxes. @@ -111,8 +111,8 @@ fun main(){ } } ``` -![](../docs/images/two-boxes-1.png) -![](../docs/images/two-boxes-2.png) +![](../images/two-boxes-1.png) +![](../images/two-boxes-2.png) ***There is plenty of other properties, especially those, which you can create by yourself. Here we mention just a small part.*** @@ -142,8 +142,8 @@ polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Poin } ``` -![](../docs/images/polyline-points.png) -![](../docs/images/polyline-points-2.png) +![](../images/polyline-points.png) +![](../images/polyline-points-2.png) ### 2) Box @@ -165,7 +165,7 @@ Let's create just usual `box` with equal ribs. color("pink") } ``` - ![](../docs/images/box.png) + ![](../images/box.png) Now, let's make `box` with bigger `y` value. ```kotlin @@ -175,7 +175,7 @@ Now, let's make `box` with bigger `y` value. ``` As you can see, only the rib of `y-axis` differs from other ribs. - ![](../docs/images/high-box.png) + ![](../images/high-box.png) For a final trial, let's create a `box` with a bigger `x` value. @@ -189,7 +189,7 @@ For a final trial, let's create a `box` with a bigger `x` value. ``` Predictably, only the `x-axis` rib is bigger than other ribs. - ![](../docs/images/wide-box.png) + ![](../images/wide-box.png) ### 3) Sphere @@ -206,7 +206,7 @@ As for `radius`, it has `Float` type, and, as you can guess, it sets the radius color("blue") } ``` - ![](../docs/images/sphere.png) + ![](../images/sphere.png) ### 4) Hexagon @@ -220,7 +220,7 @@ It is solid which has six edges. It is set by eight values: `node1`,..., `node8` 5) Edge with vertices `node1`, `node5`, `node8`, `node4` 6) Edge with vertices `node8`, `node5`, `node6`, `node7` -![](../docs/images/scheme.png) +![](../images/scheme.png) As the hexagon takes in specific points, we understand that this solid cannot be moved, it is fixed in space, and it can't make pivots. @@ -239,7 +239,7 @@ Let's make classic parallelepiped. color("green") } ``` - ![](../docs/images/classic-hexagon.png) + ![](../images/classic-hexagon.png) Now, let's make a custom hexagon. @@ -258,7 +258,7 @@ hexagon( color("brown") } ``` - ![](../docs/images/custom-hexagon.png) + ![](../images/custom-hexagon.png) ### 3) Cone It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. @@ -274,8 +274,8 @@ Let's build a classic cone: color("beige") } ``` - ![](../docs/images/cone-1.png) - ![](../docs/images/cone-2.png) + ![](../images/cone-1.png) + ![](../images/cone-2.png) First of all, we have to try to build a frustum cone: ```kotlin @@ -283,7 +283,7 @@ cone(60, 80, name = "cone") { color(0u, 40u, 0u) } ``` -![](../docs/images/frustum-cone.png) +![](../images/frustum-cone.png) Now, we need to make a try to build a cone segment: @@ -292,8 +292,8 @@ cone(60, 80, angle = PI, name = "cone") { color(0u, 0u, 200u) } ``` -![](../docs/images/cone-segment-1.png) -![](../docs/images/cone-segment-2.png) +![](../images/cone-segment-1.png) +![](../images/cone-segment-2.png) Finally, the segment of frustum cone is left for a try: ```kotlin @@ -301,7 +301,7 @@ cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { color(190u, 0u, 0u) } ``` -![](../docs/images/frustum-cone-segment.png) +![](../images/frustum-cone-segment.png) ### 4) Cone Surface This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. @@ -318,8 +318,8 @@ Let's build usual cone surface with almost all properties set: rotation = Point3D(2, 50, -9) } ``` -![](../docs/images/cone-surface-1.png) -![](../docs/images/cone-surface-2.png) +![](../images/cone-surface-1.png) +![](../images/cone-surface-2.png) Now, let's create a cone surface and set all it's properties: @@ -329,8 +329,8 @@ coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { rotation = Point3D(2, 50, -9) } ``` -![](../docs/images/cone-surface-fragment.png) -![](../docs/images/cone-surface-fragment-2.png) +![](../images/cone-surface-fragment.png) +![](../images/cone-surface-fragment-2.png) ### 5) Cylinder @@ -344,8 +344,8 @@ cylinder(40, 100, "cylinder"){ color("indigo") } ``` -![](../docs/images/cylinder-1.png) -![](../docs/images/cylinder-2.png) +![](../images/cylinder-1.png) +![](../images/cylinder-2.png) ### 6) Tube `tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* @@ -356,7 +356,7 @@ tube(50, 40, 20, name = "usual tube"){ opacity = 0.4 } ``` -![](../docs/images/tube.png) +![](../images/tube.png) This is an example of tube fragment: @@ -365,7 +365,7 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ color("white") } ``` -![](../docs/images/tube-fragment.png) +![](../images/tube-fragment.png) ### 7) Extruded `extruded` is set by two values: `shape`, and `layer`. diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 5cdcf5c0..fa3fab99 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -38,6 +38,10 @@ public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { } } +public fun ThreeCanvasWithControlsProps.options(block: Canvas3DOptions.() -> Unit){ + options = Canvas3DOptions(block) +} + public fun ThreeCanvasWithControlsProps.tab(title: String, block: RBuilder.() -> Unit) { additionalTabs = (additionalTabs ?: emptyMap()) + (title to block) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/OrbitControls.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/OrbitControls.kt index 2fe573e0..9c4ab664 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/OrbitControls.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/OrbitControls.kt @@ -17,7 +17,7 @@ import kotlin.math.PI import kotlin.math.cos import kotlin.math.max import kotlin.math.sin -import space.kscience.visionforge.solid.specifications.Camera as CameraSpec +import space.kscience.visionforge.solid.specifications.CameraScheme as CameraSpec public class OrbitControls internal constructor(camera: Camera, canvas: SubScene, spec: CameraSpec) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt new file mode 100644 index 00000000..3b85b469 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -0,0 +1,44 @@ +package space.kscience.visionforge.solid + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.numberProperty +import space.kscience.visionforge.set + +@Serializable +public abstract class LightSource : SolidBase() { + @Transient + public val color: ColorAccessor = ColorAccessor(meta, "color".asName()) + public var intensity: Number by numberProperty(includeStyles = false) { 1.0 } +} + +@Serializable +@SerialName("solid.light.ambient") +public class AmbientLightSource : LightSource() + +@VisionBuilder +public fun VisionContainerBuilder.ambientLight( + name: String? = "@ambientLight", + block: AmbientLightSource.() -> Unit = {}, +): AmbientLightSource = AmbientLightSource().apply(block).also { set(name, it) } + +@Serializable +@SerialName("solid.light.point") +public class PointLightSource : LightSource() + + +@VisionBuilder +public fun VisionContainerBuilder.pointLight( + x: Number, + y: Number, + z: Number, + name: String? = null, + block: PointLightSource.() -> Unit = {}, +): PointLightSource = PointLightSource().apply(block).also { + it.position = Point3D(x, y, z) + set(name, it) +} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index a501f7a0..76d0708b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -72,9 +72,7 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { } @Suppress("FunctionName") -public fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup { - return SolidGroup().apply(block) -} +public fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) @VisionBuilder public fun VisionContainerBuilder.group( diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index fa5b0d76..75d1f5a3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -27,7 +27,7 @@ public class SolidMaterial : Scheme() { */ public val specularColor: ColorAccessor = ColorAccessor(meta, SPECULAR_COLOR_KEY) - public val emissiveColor: ColorAccessor = ColorAccessor(meta, "emissiveColor".asName()) + public val emissiveColor: ColorAccessor = ColorAccessor(meta, EMISSIVE_COLOR_KEY) /** * Opacity @@ -43,12 +43,15 @@ public class SolidMaterial : Scheme() { public val MATERIAL_KEY: Name = "material".asName() public val COLOR_KEY: Name = "color".asName() - public val MATERIAL_COLOR_KEY: Name = MATERIAL_KEY + COLOR_KEY + public val TYPE_KEY: Name = "type".asName() public val SPECULAR_COLOR_KEY: Name = "specularColor".asName() - public val MATERIAL_SPECULAR_COLOR_KEY: Name = MATERIAL_KEY + SPECULAR_COLOR_KEY + public val EMISSIVE_COLOR_KEY: Name = "emissiveColor".asName() public val OPACITY_KEY: Name = "opacity".asName() public val MATERIAL_OPACITY_KEY: Name = MATERIAL_KEY + OPACITY_KEY public val WIREFRAME_KEY: Name = "wireframe".asName() + public val MATERIAL_COLOR_KEY: Name = MATERIAL_KEY + COLOR_KEY + public val MATERIAL_EMISSIVE_COLOR_KEY: Name = MATERIAL_KEY + EMISSIVE_COLOR_KEY + public val MATERIAL_SPECULAR_COLOR_KEY: Name = MATERIAL_KEY + SPECULAR_COLOR_KEY public val MATERIAL_WIREFRAME_KEY: Name = MATERIAL_KEY + WIREFRAME_KEY public override val descriptor: MetaDescriptor by lazy { @@ -56,6 +59,12 @@ public class SolidMaterial : Scheme() { MetaDescriptor { inherited = true + value(TYPE_KEY, ValueType.STRING){ + inherited = true + allowedValues = listOf("default".asValue(), "simple".asValue()) + default("default") + } + value(COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { inherited = true widgetType = "color" @@ -67,6 +76,12 @@ public class SolidMaterial : Scheme() { hide() } + value(EMISSIVE_COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { + inherited = true + widgetType = "color" + hide() + } + value(OPACITY_KEY, ValueType.NUMBER) { inherited = true default(1.0) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 12a22ab6..7e52d709 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -39,6 +39,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { subclass(PolyLine.serializer()) subclass(SolidLabel.serializer()) subclass(Sphere.serializer()) + + subclass(AmbientLightSource.serializer()) + subclass(PointLightSource.serializer()) } public val serializersModuleForSolids: SerializersModule = SerializersModule { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt similarity index 79% rename from visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt rename to visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt index 485cc8bd..d4eb8e2b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt @@ -7,24 +7,24 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.double -public class Axes : Scheme() { +public class AxesScheme : Scheme() { public var visible: Boolean by boolean(false) public var size: Double by double(AXIS_SIZE) public var width: Double by double(AXIS_WIDTH) - public companion object : SchemeSpec(::Axes) { + public companion object : SchemeSpec(::AxesScheme) { public const val AXIS_SIZE: Double = 1000.0 public const val AXIS_WIDTH: Double = 3.0 override val descriptor: MetaDescriptor by lazy { MetaDescriptor { - value(Axes::visible){ + value(AxesScheme::visible){ default(false) } - value(Axes::size){ + value(AxesScheme::size){ default(AXIS_SIZE) } - value(Axes::width){ + value(AxesScheme::width){ default(AXIS_WIDTH) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/CameraScheme.kt similarity index 77% rename from visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt rename to visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/CameraScheme.kt index b8cb05d4..f884bc1e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/CameraScheme.kt @@ -8,7 +8,7 @@ import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.int import kotlin.math.PI -public class Camera : Scheme() { +public class CameraScheme : Scheme() { public var fov: Int by int(FIELD_OF_VIEW) //var aspect by double(1.0) @@ -19,7 +19,7 @@ public class Camera : Scheme() { public var azimuth: Double by double(INITIAL_AZIMUTH) public var latitude: Double by double(INITIAL_LATITUDE) - public companion object : SchemeSpec(::Camera) { + public companion object : SchemeSpec(::CameraScheme) { public const val INITIAL_DISTANCE: Double = 300.0 public const val INITIAL_AZIMUTH: Double = 0.0 public const val INITIAL_LATITUDE: Double = PI / 6 @@ -29,22 +29,22 @@ public class Camera : Scheme() { override val descriptor: MetaDescriptor by lazy { MetaDescriptor { - value(Camera::fov) { + value(CameraScheme::fov) { default(FIELD_OF_VIEW) } - value(Camera::nearClip) { + value(CameraScheme::nearClip) { default(NEAR_CLIP) } - value(Camera::farClip) { + value(CameraScheme::farClip) { default(FAR_CLIP) } - value(Camera::distance) { + value(CameraScheme::distance) { default(INITIAL_DISTANCE) } - value(Camera::azimuth) { + value(CameraScheme::azimuth) { default(INITIAL_AZIMUTH) } - value(Camera::latitude) { + value(CameraScheme::latitude) { default(INITIAL_LATITUDE) } } @@ -52,4 +52,4 @@ public class Camera : Scheme() { } } -public val Camera.zenith: Double get() = PI / 2 - latitude \ No newline at end of file +public val CameraScheme.zenith: Double get() = PI / 2 - latitude \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 4a819ff7..e74b47f0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -8,38 +8,34 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.hide import space.kscience.visionforge.widgetType -public class Clipping : Scheme() { - public var x: Double? by double() - public var y: Double? by double() - public var z: Double? by double() - public companion object : SchemeSpec(::Clipping) { - override val descriptor: MetaDescriptor = MetaDescriptor { - value(Clipping::x) { - widgetType = "range" - attributes["min"] = 0.0 - attributes["max"] = 1.0 - attributes["step"] = 0.01 - default(1.0) - } - value(Clipping::y) { - widgetType = "range" - attributes["min"] = 0.0 - attributes["max"] = 1.0 - attributes["step"] = 0.01 - default(1.0) - } - value(Clipping::z) { - widgetType = "range" - attributes["min"] = 0.0 - attributes["max"] = 1.0 - attributes["step"] = 0.01 - default(1.0) - } +public object Clipping : SchemeSpec(::PointScheme) { + override val descriptor: MetaDescriptor = MetaDescriptor { + value(PointScheme::x) { + widgetType = "range" + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 + default(1.0) + } + value(PointScheme::y) { + widgetType = "range" + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 + default(1.0) + } + value(PointScheme::z) { + widgetType = "range" + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 + default(1.0) } } } + public class CanvasSize : Scheme() { public var minSize: Int by int(400) public var minWith: Number by number { minSize } @@ -62,16 +58,15 @@ public class CanvasSize : Scheme() { } public class Canvas3DOptions : Scheme() { - public var axes: Axes by spec(Axes) - public var light: Light by spec(Light) - public var camera: Camera by spec(Camera) - public var controls: Controls by spec(Controls) + public var axes: AxesScheme by spec(AxesScheme) + public var camera: CameraScheme by spec(CameraScheme) + public var controls: ControlsScheme by spec(ControlsScheme) public var size: CanvasSize by spec(CanvasSize) public var layers: List by numberList(0) - public var clipping: Clipping by spec(Clipping) + public var clipping: PointScheme by spec(Clipping) public var onSelect: ((Name?) -> Unit)? = null @@ -79,7 +74,7 @@ public class Canvas3DOptions : Scheme() { public companion object : SchemeSpec(::Canvas3DOptions) { override val descriptor: MetaDescriptor by lazy { MetaDescriptor { - scheme(Canvas3DOptions::axes, Axes) + scheme(Canvas3DOptions::axes, AxesScheme) value(Canvas3DOptions::layers) { multiple = true @@ -90,15 +85,11 @@ public class Canvas3DOptions : Scheme() { scheme(Canvas3DOptions::clipping, Clipping) - scheme(Canvas3DOptions::light, Light){ + scheme(Canvas3DOptions::camera, CameraScheme) { hide() } - scheme(Canvas3DOptions::camera, Camera) { - hide() - } - - scheme(Canvas3DOptions::controls, Controls) { + scheme(Canvas3DOptions::controls, ControlsScheme) { hide() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Controls.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt similarity index 56% rename from visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Controls.kt rename to visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt index ee8ebb9d..5e68f37c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Controls.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt @@ -4,6 +4,6 @@ import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec -public class Controls : Scheme() { - public companion object : SchemeSpec(::Controls) +public class ControlsScheme : Scheme() { + public companion object : SchemeSpec(::ControlsScheme) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Light.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Light.kt deleted file mode 100644 index 39b79466..00000000 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Light.kt +++ /dev/null @@ -1,8 +0,0 @@ -package space.kscience.visionforge.solid.specifications - -import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.SchemeSpec - -public class Light : Scheme() { - public companion object : SchemeSpec(::Light) -} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/PointScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/PointScheme.kt new file mode 100644 index 00000000..33b8c180 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/PointScheme.kt @@ -0,0 +1,19 @@ +package space.kscience.visionforge.solid.specifications + +import space.kscience.dataforge.meta.Scheme +import space.kscience.dataforge.meta.SchemeSpec +import space.kscience.dataforge.meta.double + +public class PointScheme: Scheme(){ + public var x: Double? by double() + public var y: Double? by double() + public var z: Double? by double() + + public companion object: SchemeSpec(::PointScheme) +} + +public operator fun PointScheme.invoke(x: Number?, y: Number?, z: Number?){ + this.x = x?.toDouble() + this.y = y?.toDouble() + this.z = z?.toDouble() +} \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index f8af54a0..558d005c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Colors import space.kscience.visionforge.MutableVisionGroup import space.kscience.visionforge.get import kotlin.test.Test @@ -55,4 +56,18 @@ class SerializationTest { assertEquals(group["cube"]?.meta, reconstructed["cube"]?.meta) } + @Test + fun lightSerialization(){ + val group = SolidGroup { + ambientLight { + color(Colors.white) + intensity = 100.0 + } + } + val serialized = Solids.encodeToString(group) + + val reconstructed = Solids.decodeFromString(serialized) as SolidGroup + assertEquals(100.0, (reconstructed["@ambientLight"] as AmbientLightSource).intensity.toDouble()) + } + } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 1d5fd3d9..7ac4f13e 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.boolean +import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.setProperty @@ -75,6 +76,7 @@ public abstract class MeshThreeFactory( } } +@VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { setProperty(EDGES_ENABLED_KEY, enabled) meta.getOrCreate(EDGES_MATERIAL_KEY).updateWith(SolidMaterial, block) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt new file mode 100644 index 00000000..c3d6bfa0 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -0,0 +1,19 @@ +package space.kscience.visionforge.solid.three + +import info.laht.threekt.lights.AmbientLight +import info.laht.threekt.math.Color +import space.kscience.visionforge.solid.AmbientLightSource +import kotlin.reflect.KClass + +public object ThreeAmbientLightFactory : ThreeFactory { + override val type: KClass get() = AmbientLightSource::class + + override fun invoke(three: ThreePlugin, obj: AmbientLightSource): AmbientLight { + val res = AmbientLight().apply { + color = obj.color.threeColor() ?: Color(0x404040) + intensity = obj.intensity.toDouble() + } + + return res + } +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index ef9944e0..586abe32 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -8,12 +8,8 @@ import info.laht.threekt.external.controls.OrbitControls import info.laht.threekt.external.controls.TrackballControls import info.laht.threekt.geometries.EdgesGeometry import info.laht.threekt.helpers.AxesHelper -import info.laht.threekt.lights.AmbientLight import info.laht.threekt.materials.LineBasicMaterial -import info.laht.threekt.math.Box3 -import info.laht.threekt.math.Plane -import info.laht.threekt.math.Vector2 -import info.laht.threekt.math.Vector3 +import info.laht.threekt.math.* import info.laht.threekt.objects.LineSegments import info.laht.threekt.objects.Mesh import info.laht.threekt.scenes.Scene @@ -35,7 +31,7 @@ import kotlin.math.cos import kotlin.math.sin /** - * + * A canvas for three-js rendering */ public class ThreeCanvas( public val three: ThreePlugin, @@ -60,19 +56,19 @@ public class ThreeCanvas( add(axesObject) } - //Set up light - options.useProperty(Canvas3DOptions::light, this) { lightConfig -> - //remove old light if present - getObjectByName(LIGHT_NAME)?.let { remove(it) } - //add new light - val lightObject = buildLight(lightConfig) - lightObject.name = LIGHT_NAME - add(lightObject) - } +// //Set up light +// options.useProperty(Canvas3DOptions::light, this) { lightConfig -> +// //remove old light if present +// getObjectByName(LIGHT_NAME)?.let { remove(it) } +// //add new light +// val lightObject = buildLight(lightConfig) +// lightObject.name = LIGHT_NAME +// add(lightObject) +// } } - private fun buildCamera(spec: Camera) = PerspectiveCamera( + private fun buildCamera(spec: CameraScheme) = PerspectiveCamera( spec.fov, 1.0, spec.nearClip, @@ -231,9 +227,24 @@ public class ThreeCanvas( } } - private fun buildLight(spec: Light?): info.laht.threekt.lights.Light = AmbientLight(0x404040) +// private fun buildLight(spec: AmbientLightScheme?): info.laht.threekt.lights.Light = when (spec?.type) { +// AmbientLightScheme.Type.POINT -> PointLight().apply { +// position.x = spec.position.x ?: 0.0 +// position.y = spec.position.y ?: 0.0 +// position.z = spec.position.z ?: 0.0 +// } +// else -> AmbientLight().apply { +// +// } +// }.apply { +// this.color = spec?.color?.threeColor() ?: Color(0x404040) +// +// spec?.intensity?.coerceIn(0.0, 1.0)?.let { +// this.intensity = it +// } +// } - private fun addControls(element: Node, controls: Controls) { + private fun addControls(element: Node, controls: ControlsScheme) { when (controls.meta["type"].string) { "trackball" -> TrackballControls(camera, element) else -> OrbitControls(camera, element) @@ -311,7 +322,7 @@ public class ThreeCanvas( private const val SELECT_NAME = "@select" private const val LIGHT_NAME = "@light" private const val AXES_NAME = "@axes" - private const val CLIP_HELPER_NAME = "@clipping" + //private const val CLIP_HELPER_NAME = "@clipping" } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index df9f2c94..6e540f71 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -8,7 +8,6 @@ import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision -import space.kscience.visionforge.computeProperty import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.three.ThreeFactory.Companion.TYPE @@ -58,7 +57,7 @@ public fun Object3D.updatePosition(obj: Vision) { * Update non-position non-geometry property */ public fun Object3D.updateProperty(source: Vision, propertyName: Name) { - console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}") + // console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}") if (this is Mesh && propertyName.startsWith(MATERIAL_KEY)) { updateMaterialProperty(source, propertyName) } else if ( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 522c0362..5b4fa220 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -3,39 +3,52 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.materials.LineBasicMaterial import info.laht.threekt.materials.Material import info.laht.threekt.materials.MeshBasicMaterial +import info.laht.threekt.materials.MeshStandardMaterial import info.laht.threekt.math.Color import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.getStyleNodes +import space.kscience.visionforge.solid.ColorAccessor import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.SolidReference public object ThreeMaterials { public val DEFAULT_COLOR: Color = Color(Colors.darkgreen) - public val DEFAULT: MeshBasicMaterial = MeshBasicMaterial().apply { + + public val DEFAULT: MeshStandardMaterial = MeshStandardMaterial().apply { color.set(DEFAULT_COLOR) cached = true } - public val DEFAULT_LINE_COLOR: Color = Color(Colors.black) + + public val BLACK_COLOR: Color = Color(Colors.black) + + public val DEFAULT_EMISSIVE_COLOR: Color = BLACK_COLOR + + public val DEFAULT_LINE_COLOR: Color get() = BLACK_COLOR + public val DEFAULT_LINE: LineBasicMaterial = LineBasicMaterial().apply { color.set(DEFAULT_LINE_COLOR) + cached = true } public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { color.set(Colors.ivory) linewidth = 8.0 + cached = true } public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { color.set(Colors.blue) linewidth = 8.0 + cached = true } private val lineMaterialCache = HashMap() @@ -58,34 +71,21 @@ public object ThreeMaterials { private val materialCache = HashMap() - internal fun buildMaterial(meta: Meta): Material = MeshBasicMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + internal fun buildMaterial(meta: Meta): Material = when (meta[SolidMaterial.TYPE_KEY]?.string) { + "simple" -> MeshBasicMaterial().apply { + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false + } + else -> MeshStandardMaterial().apply { + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + emissive = meta[SolidMaterial.EMISSIVE_COLOR_KEY]?.threeColor() ?: DEFAULT_EMISSIVE_COLOR + wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false + } + }.apply { opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 transparent = opacity < 1.0 - wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false needsUpdate = true } -// val material = SolidMaterial.read(meta) -// return meta[SolidMaterial.SPECULAR_COLOR_KEY]?.let { specularColor -> -// MeshPhongMaterial().apply { -// color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR -// specular = specularColor.threeColor() -// emissive = material.emissiveColor.threeColor() ?: specular -// reflectivity = 0.5 -// refractionRatio = 1.0 -// shininess = 100.0 -// opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 -// transparent = opacity < 1.0 -// wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false -// needsUpdate = true -// } -// } ?: MeshBasicMaterial().apply { -// color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR -// opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 -// transparent = opacity < 1.0 -// wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false -// needsUpdate = true -// } internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta) { buildMaterial(meta).apply { @@ -115,6 +115,16 @@ public fun Meta.threeColor(): Color? { } } +public fun ColorAccessor.threeColor(): Color? { + val value = value + return when { + value == null -> null + value === Null -> null + value.type == ValueType.NUMBER -> Color(value.int) + else -> Color(value.string) + } +} + private var Material.cached: Boolean get() = userData["cached"] == true set(value) { @@ -139,7 +149,11 @@ public fun Mesh.updateMaterial(vision: Vision) { } public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { - if (material.cached || propertyName == SolidMaterial.MATERIAL_KEY) { + if ( + material.cached + || propertyName == SolidMaterial.MATERIAL_KEY + || propertyName == SolidMaterial.MATERIAL_KEY + SolidMaterial.TYPE_KEY + ) { //generate a new material since cached material should not be changed updateMaterial(vision) } else { @@ -149,6 +163,16 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { ?: ThreeMaterials.DEFAULT_COLOR material.needsUpdate = true } + SolidMaterial.SPECULAR_COLOR_KEY -> { + material.asDynamic().specular = vision.computePropertyNode(SolidMaterial.SPECULAR_COLOR_KEY)?.threeColor() + ?: ThreeMaterials.DEFAULT_COLOR + material.needsUpdate = true + } + SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { + material.asDynamic().emissive = vision.computePropertyNode(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY)?.threeColor() + ?: ThreeMaterials.BLACK_COLOR + material.needsUpdate = true + } SolidMaterial.MATERIAL_OPACITY_KEY -> { val opacity = vision.getPropertyValue( SolidMaterial.MATERIAL_OPACITY_KEY, diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index aa5c2a14..8c32551a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.Object3D -import kotlinx.coroutines.CoroutineScope import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* @@ -27,8 +26,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { private val objectFactories = HashMap, ThreeFactory<*>>() private val compositeFactory = ThreeCompositeFactory(this) - //TODO generate a separate supervisor update scope - internal val updateScope: CoroutineScope get() = context +// internal val updateScope: CoroutineScope get() = context init { //Add specialized factories here @@ -38,6 +36,8 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[ConeSegment::class] = ThreeConeFactory objectFactories[PolyLine::class] = ThreeLineFactory objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory + objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory + objectFactories[PointLightSource::class] = ThreePointLightFactory } @Suppress("UNCHECKED_CAST") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt new file mode 100644 index 00000000..a7a6d758 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -0,0 +1,28 @@ +package space.kscience.visionforge.solid.three + +import info.laht.threekt.lights.PointLight +import info.laht.threekt.math.Color +import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.solid.PointLightSource +import kotlin.reflect.KClass + +public object ThreePointLightFactory : ThreeFactory { + override val type: KClass get() = PointLightSource::class + + override fun invoke(three: ThreePlugin, obj: PointLightSource): PointLight { + val res = PointLight().apply { + matrixAutoUpdate = false + color = obj.color.threeColor() ?: Color(0x404040) + intensity = obj.intensity.toDouble() + updatePosition(obj) + } + + obj.onPropertyChange { name -> + when { + else -> res.updateProperty(obj, name) + } + } + + return res + } +} \ No newline at end of file -- 2.34.1 From 7ee40679b974b4f39b35800e0d6137b0c2bf4185 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 28 Jan 2022 14:17:37 +0300 Subject: [PATCH 069/143] Update light descriptor --- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 7 ++- .../mipt/npm/muon/monitor/MMAppComponent.kt | 6 ++- kotlin-js-store/yarn.lock | 8 ++-- .../visionforge/solid/ColorAccessor.kt | 11 ++++- .../kscience/visionforge/solid/LightSource.kt | 46 +++++++++++++++---- visionforge-threejs/build.gradle.kts | 2 +- .../solid/three/ThreePointLightFactory.kt | 6 ++- 7 files changed, 68 insertions(+), 18 deletions(-) diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 2dab49a2..06501374 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -8,6 +8,12 @@ import space.kscience.visionforge.removeAll import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.* +import kotlin.collections.HashMap +import kotlin.collections.HashSet +import kotlin.collections.filter +import kotlin.collections.forEach +import kotlin.collections.set +import kotlin.collections.toTypedArray import kotlin.math.PI class Model(val manager: VisionManager) { @@ -39,7 +45,6 @@ class Model(val manager: VisionManager) { val root: SolidGroup = SolidGroup().apply { setAsRoot(this@Model.manager) material { - wireframe color("darkgreen") } rotationX = PI / 2 diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 350d25f3..f9c03756 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -19,11 +19,13 @@ import react.useState import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Colors import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.edges import styled.css @@ -55,7 +57,9 @@ val MMApp = fc("Muon monitor") { props -> val root = useMemo(props.model) { props.model.root.apply { edges() - ambientLight() + ambientLight{ + color(Colors.white) + } } } diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index df058368..bf21978a 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -8244,10 +8244,10 @@ three-csg-ts@3.1.9: resolved "https://registry.yarnpkg.com/three-csg-ts/-/three-csg-ts-3.1.9.tgz#1438de3b6747b9b55deb88d9e0acdc6e47681979" integrity sha512-Qke0+07AKDfeiRjh46sOF2iiilSMcKnfgHjuArdMB4poZs3X0FQLHGFIEBbGrv3ejrkHASW9o5pLRfFFQhk9hg== -three@0.130.1: - version "0.130.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.130.1.tgz#797588b2877ace31603bbbc864eb2e3022f0b3b4" - integrity sha512-OSPPKcGvFSiGkG3jFrwwC76PBV/ZSrGxpBbg28bW8s9GU8r/y2spNGtEXHEb/CVqo0Ctf5Lx2rVaxQZB6OasaA== +three@0.137.4: + version "0.137.4" + resolved "https://registry.yarnpkg.com/three/-/three-0.137.4.tgz#ec73b6a6c40b733d56544b13d0c3cdb0bce5d0a7" + integrity sha512-kUyOZNX+dMbvaS0mGYM1BaXHkHVNQdpryWH8dBg3mn725dJcTo9/5rjyH+OJ8V0r+XbZPz7sncV+c3Gjpc9UBA== through2@^0.6.3: version "0.6.5" diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 57f868f2..0f9abc4d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -1,15 +1,18 @@ package space.kscience.visionforge.solid +import space.kscience.dataforge.meta.Configurable import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionBuilder +import kotlin.properties.ReadOnlyProperty @VisionBuilder public class ColorAccessor( private val provider: MutableValueProvider, - private val colorKey: Name + private val colorKey: Name, ) : MutableValueProvider { public var value: Value? get() = provider.getValue(colorKey) @@ -24,8 +27,12 @@ public class ColorAccessor( } } +public fun Configurable.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> + ColorAccessor(meta, property.name.asName()) +} + public var ColorAccessor?.string: String? - get() = this?.value?.let { if(it == Null) null else it.string } + get() = this?.value?.let { if (it == Null) null else it.string } set(value) { this?.value = value?.asValue() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 3b85b469..6bab2cf3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -2,18 +2,48 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import space.kscience.dataforge.names.asName -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.numberProperty -import space.kscience.visionforge.set +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.node +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.values.ValueType +import space.kscience.visionforge.* @Serializable public abstract class LightSource : SolidBase() { - @Transient - public val color: ColorAccessor = ColorAccessor(meta, "color".asName()) + override val descriptor: MetaDescriptor get() = LightSource.descriptor + + public val color: ColorAccessor by color() public var intensity: Number by numberProperty(includeStyles = false) { 1.0 } + + public companion object{ + public val descriptor: MetaDescriptor by lazy { + MetaDescriptor { + value(Vision.VISIBLE_KEY, ValueType.BOOLEAN) { + inherited = false + default(true) + } + + value(LightSource::color.name, ValueType.STRING, ValueType.NUMBER) { + inherited = false + widgetType = "color" + } + + value(LightSource::intensity.name, ValueType.NUMBER) { + inherited = false + default(1.0) + } + + value(SolidMaterial.COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { + inherited = false + widgetType = "color" + } + + node(Solid.POSITION_KEY) { + hide() + } + } + } + } } @Serializable diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 5ae86f41..3aa1ef5e 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -10,6 +10,6 @@ kotlin{ dependencies { api(project(":visionforge-solid")) - implementation(npm("three", "0.130.1")) + implementation(npm("three", "0.137.4")) implementation(npm("three-csg-ts", "3.1.9")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt index a7a6d758..727aa098 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -2,7 +2,9 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.lights.PointLight import info.laht.threekt.math.Color +import space.kscience.dataforge.names.asName import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.solid.LightSource import space.kscience.visionforge.solid.PointLightSource import kotlin.reflect.KClass @@ -18,7 +20,9 @@ public object ThreePointLightFactory : ThreeFactory { } obj.onPropertyChange { name -> - when { + when (name) { + LightSource::color.name.asName() -> res.color = obj.color.threeColor() ?: Color(0x404040) + LightSource::intensity.name.asName() -> res.intensity = obj.intensity.toDouble() else -> res.updateProperty(obj, name) } } -- 2.34.1 From 9648533ac88f21bfb1d8a65a17260c1f78239a60 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 13 Apr 2022 15:02:35 +0300 Subject: [PATCH 070/143] Update build tools --- build.gradle.kts | 2 +- demo/muon-monitor/build.gradle.kts | 4 +- gradle.properties | 7 +- kotlin-js-store/yarn.lock | 9201 ----------------- ui/ring/build.gradle.kts | 2 +- visionforge-gdml/build.gradle.kts | 2 +- visionforge-server/build.gradle.kts | 6 +- .../build.gradle.kts | 2 +- 8 files changed, 10 insertions(+), 9216 deletions(-) delete mode 100644 kotlin-js-store/yarn.lock diff --git a/build.gradle.kts b/build.gradle.kts index 0cd9f7da..c3148a64 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("ru.mipt.npm.gradle.project") - id("org.jetbrains.kotlinx.kover") version "0.5.0-RC" +// id("org.jetbrains.kotlinx.kover") version "0.5.0" } val dataforgeVersion by extra("0.5.2") diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index d33cd455..59d3495a 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -45,8 +45,8 @@ kotlin { jvmMain { dependencies { implementation("org.apache.commons:commons-math3:3.6.1") - implementation(npmlibs.ktor.server.cio) - implementation(npmlibs.ktor.serialization) + implementation("io.ktor-server-cio:${npmlibs.versions.ktor}") + implementation("io.ktor:ktor-serialization-kotlinx-json:${npmlibs.versions.ktor}") } } jsMain { diff --git a/gradle.properties b/gradle.properties index e029eef4..1d420172 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true - kotlin.jupyter.add.scanner=false -org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true -publishing.github=false -publishing.sonatype=false - -toolsVersion=0.11.1-kotlin-1.6.10 \ No newline at end of file +toolsVersion=0.11.4-kotlin-1.6.20 \ No newline at end of file diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock deleted file mode 100644 index bf21978a..00000000 --- a/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,9201 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"3d-view@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.1.tgz#2e174571c48215736b376bb66938a3513dad2179" - integrity sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA== - dependencies: - matrix-camera-controller "^2.1.1" - orbit-camera-controller "^4.0.0" - turntable-camera-controller "^3.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" - integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== - -"@babel/core@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" - integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - -"@babel/helper-create-regexp-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" - integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" - integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" - integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== - dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" - integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" - integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": - version "7.16.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" - integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" - integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - -"@babel/plugin-proposal-async-generator-functions@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" - integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" - integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" - integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" - integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" - integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" - integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" - integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" - integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" - integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" - integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" - integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" - integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" - integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" - integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" - integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" - integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" - integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" - integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" - -"@babel/plugin-transform-block-scoped-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" - integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" - integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" - integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" - integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" - integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" - integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" - integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" - integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" - integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" - integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" - integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" - integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" - integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" - integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.16.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" - integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== - dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.15.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" - integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" - integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - -"@babel/plugin-transform-new-target@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" - integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" - integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - -"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" - integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" - integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-display-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" - integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-development@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" - integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.0" - -"@babel/plugin-transform-react-jsx@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" - integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/plugin-transform-react-pure-annotations@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" - integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" - integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" - integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@^7.14.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" - integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" - integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" - integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" - integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-strict-mode@^7.12.13": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz#2be5ad4f087c188cfed6f01e327a9ccd4dc0c488" - integrity sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" - integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" - integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.16.0": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" - integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.16.0" - -"@babel/plugin-transform-unicode-escapes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" - integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" - integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@^7.14.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" - integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-async-generator-functions" "^7.16.4" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-class-static-block" "^7.16.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.0" - "@babel/plugin-proposal-export-namespace-from" "^7.16.0" - "@babel/plugin-proposal-json-strings" "^7.16.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-object-rest-spread" "^7.16.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-proposal-private-property-in-object" "^7.16.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.0" - "@babel/plugin-transform-async-to-generator" "^7.16.0" - "@babel/plugin-transform-block-scoped-functions" "^7.16.0" - "@babel/plugin-transform-block-scoping" "^7.16.0" - "@babel/plugin-transform-classes" "^7.16.0" - "@babel/plugin-transform-computed-properties" "^7.16.0" - "@babel/plugin-transform-destructuring" "^7.16.0" - "@babel/plugin-transform-dotall-regex" "^7.16.0" - "@babel/plugin-transform-duplicate-keys" "^7.16.0" - "@babel/plugin-transform-exponentiation-operator" "^7.16.0" - "@babel/plugin-transform-for-of" "^7.16.0" - "@babel/plugin-transform-function-name" "^7.16.0" - "@babel/plugin-transform-literals" "^7.16.0" - "@babel/plugin-transform-member-expression-literals" "^7.16.0" - "@babel/plugin-transform-modules-amd" "^7.16.0" - "@babel/plugin-transform-modules-commonjs" "^7.16.0" - "@babel/plugin-transform-modules-systemjs" "^7.16.0" - "@babel/plugin-transform-modules-umd" "^7.16.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" - "@babel/plugin-transform-new-target" "^7.16.0" - "@babel/plugin-transform-object-super" "^7.16.0" - "@babel/plugin-transform-parameters" "^7.16.3" - "@babel/plugin-transform-property-literals" "^7.16.0" - "@babel/plugin-transform-regenerator" "^7.16.0" - "@babel/plugin-transform-reserved-words" "^7.16.0" - "@babel/plugin-transform-shorthand-properties" "^7.16.0" - "@babel/plugin-transform-spread" "^7.16.0" - "@babel/plugin-transform-sticky-regex" "^7.16.0" - "@babel/plugin-transform-template-literals" "^7.16.0" - "@babel/plugin-transform-typeof-symbol" "^7.16.0" - "@babel/plugin-transform-unicode-escapes" "^7.16.0" - "@babel/plugin-transform-unicode-regex" "^7.16.0" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.0" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.19.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.13.13": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" - integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.16.0" - "@babel/plugin-transform-react-jsx" "^7.16.0" - "@babel/plugin-transform-react-jsx-development" "^7.16.0" - "@babel/plugin-transform-react-pure-annotations" "^7.16.0" - -"@babel/preset-typescript@^7.14.5": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" - integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.16.0" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.4.5": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@choojs/findup@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" - integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== - dependencies: - commander "^2.15.1" - -"@csstools/convert-colors@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-2.0.0.tgz#6dd323583b40cfe05aaaca30debbb30f26742bbf" - integrity sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" - integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== - -"@emotion/is-prop-valid@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@jetbrains/angular-elastic@^2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz#ddfffdd3941eaf839fd29069fc8faf7536329988" - integrity sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q== - dependencies: - angular ">=1.0.6" - -"@jetbrains/babel-preset-jetbrains@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.2.tgz#b62fab630080c5e78513e2cdbe85d4940f4e3164" - integrity sha512-hC8HpdxftzMc2OwwzKIsBzq/8paGT/+IcH7TZfy0RWusq0K1wWnjRQMH5o9J0RkdARlDnOxDxEHYA9fE6DFKLw== - dependencies: - "@babel/plugin-transform-runtime" "^7.14.3" - "@babel/plugin-transform-strict-mode" "^7.12.13" - "@babel/preset-env" "^7.14.4" - "@babel/preset-react" "^7.13.13" - "@babel/preset-typescript" "^7.14.5" - "@babel/runtime" "^7.14.0" - babel-plugin-angularjs-annotate "^0.10.0" - -"@jetbrains/icons@^3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@jetbrains/icons/-/icons-3.18.0.tgz#96d3ff8f9029b9f196a9a936cd2c6797aa2c17f2" - integrity sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA== - -"@jetbrains/logos@^1.4.27": - version "1.4.27" - resolved "https://registry.yarnpkg.com/@jetbrains/logos/-/logos-1.4.27.tgz#4412ed2abaf74756e44bb84643431fc270ec3031" - integrity sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA== - -"@jetbrains/postcss-require-hover@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz#927f24fa7cb27e3a3ed2c4eca716e5a206577e18" - integrity sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw== - dependencies: - postcss "^6.0.1" - -"@jetbrains/ring-ui@^4.1.5": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@jetbrains/ring-ui/-/ring-ui-4.1.6.tgz#bb1d95a169dc5b8b0915258d772fbbd99ad739bf" - integrity sha512-/HFw77+gzN6YxsaGG5Wga4ZOwfs65GfailwCoY4Xdm05OqWHKIJmzTr0+Tc0w12Lg9Km7ymxrRIOQKcXOdjSFQ== - dependencies: - "@babel/core" "^7.16.0" - "@jetbrains/angular-elastic" "^2.5.1" - "@jetbrains/babel-preset-jetbrains" "^2.3.2" - "@jetbrains/icons" "^3.18.0" - "@jetbrains/logos" "^1.4.27" - "@jetbrains/postcss-require-hover" "^0.1.2" - "@ungap/url-search-params" "^0.2.2" - babel-loader "^8.2.3" - babel-plugin-transform-define "^2.0.1" - browserslist "^4.16.6" - change-case "^4.1.1" - classnames "^2.3.1" - combokeys "^3.0.1" - compile-code-loader "^1.0.0" - conic-gradient "^1.0.0" - css-loader "^6.5.1" - date-fns "^2.27.0" - deep-equal "^2.0.4" - element-resize-detector "^1.2.3" - es6-error "^4.1.1" - eslint-plugin-react-hooks "^4.3.0" - extricate-loader "^3.0.0" - fastdom "^1.0.10" - file-loader "^6.2.0" - focus-trap "^6.7.1" - focus-visible "^5.2.0" - highlight.js "^10.7.2" - html-loader "^3.0.1" - interpolate-loader "^2.0.1" - just-debounce-it "^3.0.1" - memoize-one "^6.0.0" - postcss "^8.4.4" - postcss-calc "^8.0.0" - postcss-flexbugs-fixes "^5.0.2" - postcss-font-family-system-ui "^5.0.0" - postcss-loader "^6.2.1" - postcss-modules-values-replace "^3.4.0" - postcss-preset-env "^7.0.1" - prop-types "^15.7.2" - react-markdown "^5.0.3" - react-movable "^3.0.2" - react-virtualized "^9.22.3" - react-waypoint "^10.1.0" - remark-breaks "^3.0.2" - remark-gfm "^1.0.0" - scrollbar-width "^3.1.1" - simply-uuid "^1.0.1" - sniffr "^1.2.0" - style-inject "^0.3.0" - style-loader "~3.3.1" - url-loader "^4.1.1" - util-deprecate "^1.0.2" - -"@mapbox/geojson-rewind@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1" - integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA== - dependencies: - get-stream "^6.0.1" - minimist "^1.2.5" - -"@mapbox/geojson-types@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" - integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== - -"@mapbox/jsonlint-lines-primitives@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" - integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= - -"@mapbox/mapbox-gl-supported@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" - integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== - -"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" - integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= - -"@mapbox/tiny-sdf@^1.1.1": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" - integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== - -"@mapbox/unitbezier@^0.0.0": - version "0.0.0" - resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" - integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= - -"@mapbox/vector-tile@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" - integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== - dependencies: - "@mapbox/point-geometry" "~0.1.0" - -"@mapbox/whoots-js@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" - integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@plotly/d3-sankey-circular@0.33.1": - version "0.33.1" - resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" - integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== - dependencies: - d3-array "^1.2.1" - d3-collection "^1.0.4" - d3-shape "^1.2.0" - elementary-circuits-directed-graph "^1.0.4" - -"@plotly/d3-sankey@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" - integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== - dependencies: - d3-array "1" - d3-collection "1" - d3-shape "^1.2.0" - -"@plotly/point-cluster@^3.1.9": - version "3.1.9" - resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" - integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== - dependencies: - array-bounds "^1.0.1" - binary-search-bounds "^2.0.4" - clamp "^1.0.1" - defined "^1.0.0" - dtype "^2.0.0" - flatten-vertex-data "^1.0.2" - is-obj "^1.0.1" - math-log2 "^1.0.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@turf/area@^6.0.1": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" - integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/bbox@^6.0.1": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" - integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/centroid@^6.0.2": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" - integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/helpers@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" - integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== - -"@turf/meta@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" - integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== - dependencies: - "@turf/helpers" "^6.5.0" - -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== - -"@types/cookie@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.8": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/eslint-scope@^3.7.0": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" - integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.0.tgz#afd0519223c29c347087542cbaee2fedc0873b16" - integrity sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/http-proxy@^1.17.5": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" - integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== - dependencies: - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/node@*", "@types/node@>=10.0.0": - version "16.11.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" - integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - -"@types/tabulator-tables@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/tabulator-tables/-/tabulator-tables-5.0.1.tgz#824fef3bef01c38a3bd934016a25e52e1043bf35" - integrity sha512-ieidxy+/bzMCPZsDeSw56DN9ipQ0K4Ts3ZUxPy4yCVExcAsezL4u2UYHBA+BxQ8l7QmEaERT/ctmBqjkRUhh+w== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@ungap/url-search-params@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" - integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" - integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== - -"@webpack-cli/info@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" - integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" - integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -a-big-triangle@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" - integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= - dependencies: - gl-buffer "^2.1.1" - gl-vao "^1.2.0" - weak-map "^1.0.5" - -abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" - integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.0.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^6.1.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -acorn@^8.4.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" - integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== - -add-line-numbers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" - integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= - dependencies: - pad-left "^1.0.2" - -affine-hull@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" - integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= - dependencies: - robust-orientation "^1.1.3" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -almost-equal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" - integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= - -alpha-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" - integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= - dependencies: - circumradius "^1.0.0" - delaunay-triangulate "^1.1.6" - -alpha-shape@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" - integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= - dependencies: - alpha-complex "^1.0.0" - simplicial-complex-boundary "^1.0.0" - -angular@>=1.0.6: - version "1.8.2" - resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.2.tgz#5983bbb5a9fa63e213cb7749199e0d352de3a2f1" - integrity sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -array-bounds@^1.0.0, array-bounds@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" - integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== - -array-find-index@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-normalize@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" - integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== - dependencies: - array-bounds "^1.0.0" - -array-range@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" - integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= - -array-rearrange@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" - integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -atob-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" - integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= - -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - -autoprefixer@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" - integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== - dependencies: - browserslist "^4.17.5" - caniuse-lite "^1.0.30001272" - fraction.js "^4.1.1" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -babel-loader@^8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-angularjs-annotate@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz#4213b3aaae494a087aad0b8237c5d0716d22ca76" - integrity sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/types" "^7.2.0" - simple-is "~0.2.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" - integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" - integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - core-js-compat "^3.18.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" - integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" - integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-transform-define@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz#6a34fd6ea89989feb75721ee4cce817ec779be7f" - integrity sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw== - dependencies: - lodash "^4.17.11" - traverse "0.6.6" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -barycentric@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" - integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= - dependencies: - robust-linear-solve "^1.0.0" - -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -batch-processor@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" - integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -big-rat@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" - integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= - dependencies: - bit-twiddle "^1.0.2" - bn.js "^4.11.6" - double-bits "^1.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" - integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== - -bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" - integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= - -bit-twiddle@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" - integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= - -bitmap-sdf@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" - integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== - dependencies: - clamp "^1.0.1" - -bl@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" - integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bn.js@^4.11.6: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -bootstrap@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" - integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== - -boundary-cells@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.2.tgz#ed28c5a2eb36500413e5714f8eec862ad8ffec14" - integrity sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w== - -box-intersect@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" - integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== - dependencies: - bit-twiddle "^1.0.2" - typedarray-pool "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -buble@^0.19.3: - version "0.19.8" - resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" - integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== - dependencies: - acorn "^6.1.1" - acorn-dynamic-import "^4.0.0" - acorn-jsx "^5.0.1" - chalk "^2.4.2" - magic-string "^0.25.3" - minimist "^1.2.0" - os-homedir "^2.0.0" - regexpu-core "^4.5.4" - -bubleify@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.1.tgz#c11fa33fa59d5b9b747d4e486f43889084257f37" - integrity sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ== - dependencies: - buble "^0.19.3" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" - integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= - -caniuse-lite@^1.0.30000655, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280: - version "1.0.30001283" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" - integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== - -canvas-fit@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" - integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= - dependencies: - element-size "^1.1.1" - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -cdt2d@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" - integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= - dependencies: - binary-search-bounds "^2.0.3" - robust-in-sphere "^1.1.3" - robust-orientation "^1.1.3" - -cell-orientation@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" - integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chokidar@3.5.2, chokidar@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -circumcenter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" - integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= - dependencies: - dup "^1.0.0" - robust-linear-solve "^1.0.0" - -circumradius@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" - integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= - dependencies: - circumcenter "^1.0.0" - -clamp@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" - integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= - -classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-css@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" - integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== - dependencies: - source-map "~0.6.0" - -clean-pslg@^1.1.0, clean-pslg@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" - integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= - dependencies: - big-rat "^1.0.3" - box-intersect "^1.0.1" - nextafter "^1.0.0" - rat-vec "^1.1.1" - robust-segment-intersect "^1.0.1" - union-find "^1.0.2" - uniq "^1.0.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -color-alpha@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" - integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== - dependencies: - color-parse "^1.4.1" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-id@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" - integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== - dependencies: - clamp "^1.0.1" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-normalize@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" - integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== - dependencies: - color-rgba "^2.2.0" - dtype "^2.0.0" - -color-parse@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" - integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== - dependencies: - color-name "^1.0.0" - -color-rgba@^2.1.1, color-rgba@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.3.0.tgz#d5eb481d7933d2542d1f222ea10ad40d159e9d35" - integrity sha512-z/5fMOY8/IzrBHPBk+n3ATNSM/1atXcHCRPTGPLlzYJ4fn7CRD46zzt3lkLtQ44cL8UIUU4JBXDVrhWj1khiwg== - dependencies: - color-parse "^1.4.1" - color-space "^1.14.6" - -color-space@^1.14.6: - version "1.16.0" - resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" - integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== - dependencies: - hsluv "^0.0.3" - mumath "^3.3.4" - -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -colormap@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.2.tgz#4422c1178ce563806e265b96782737be85815abf" - integrity sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA== - dependencies: - lerp "^1.0.3" - -colors@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combokeys@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.1.tgz#fc8ca5c3f5f2d2b03a458544cb88b14ab5f53f86" - integrity sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw== - -commander@2, commander@^2.15.1, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-angle@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" - integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= - dependencies: - robust-orientation "^1.0.2" - robust-product "^1.0.0" - robust-sum "^1.0.0" - signum "^0.0.0" - two-sum "^1.0.0" - -compare-cell@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" - integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= - -compare-oriented-cell@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" - integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= - dependencies: - cell-orientation "^1.0.1" - compare-cell "^1.0.0" - -compile-code-loader@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/compile-code-loader/-/compile-code-loader-1.0.0.tgz#492002e69e0ce91dff42bec420bbaf575f4c9c4a" - integrity sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw== - dependencies: - loader-utils "^2.0.0" - -component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-dims@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" - integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== - dependencies: - utils-copy "^1.0.0" - validate.io-array "^1.0.6" - validate.io-matrix-like "^1.0.2" - validate.io-ndarray-like "^1.0.0" - validate.io-positive-integer "^1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -conic-gradient@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/conic-gradient/-/conic-gradient-1.0.0.tgz#0bd7aaddeaa14aa5a7c08b22a6ee90613f610479" - integrity sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw== - dependencies: - prefixfree "^1.0.0" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -"consolidated-events@^1.1.0 || ^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" - integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== - -const-max-uint32@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" - integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= - -const-pinf-float64@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" - integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= - -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convex-hull@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" - integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= - dependencies: - affine-hull "^1.0.0" - incremental-convex-hull "^1.0.1" - monotone-convex-hull-2d "^1.0.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -core-js-compat@^3.18.0, core-js-compat@^3.19.1: - version "3.19.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.2.tgz#18066a3404a302433cb0aa8be82dd3d75c76e5c4" - integrity sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ== - dependencies: - browserslist "^4.18.1" - semver "7.0.0" - -core-js@3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" - integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -country-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" - integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-blank-pseudo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz#10667f9c5f91e4fbde76c4efac55e8eaa6ed9967" - integrity sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= - -css-font-size-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" - integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= - -css-font-stretch-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" - integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= - -css-font-style-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" - integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= - -css-font-weight-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" - integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= - -css-font@^1.0.0, css-font@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" - integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== - dependencies: - css-font-size-keywords "^1.0.0" - css-font-stretch-keywords "^1.0.1" - css-font-style-keywords "^1.0.1" - css-font-weight-keywords "^1.0.0" - css-global-keywords "^1.0.1" - css-system-font-keywords "^1.0.0" - pick-by-alias "^1.2.0" - string-split-by "^1.0.0" - unquote "^1.1.0" - -css-global-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" - integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= - -css-has-pseudo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz#43ae03a990cf3d9e7356837c6b500e04037606b5" - integrity sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA== - dependencies: - postcss-selector-parser "^6" - -css-in-js-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== - dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" - -css-in-js-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" - integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== - dependencies: - hyphenate-style-name "^1.0.3" - -css-loader@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.3.0.tgz#334d3500ff0a0c14cfbd4b0670088dbb5b5c1530" - integrity sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - -css-loader@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" - integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - -css-prefers-color-scheme@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz#a89bc1abfe946e77a1a1e12dbc25a1439705933f" - integrity sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA== - -css-system-font-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" - integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= - -css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -csscolorparser@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" - integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= - -cssdb@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.0.0.tgz#96db23e70dda3d03a32346de611f0e79fee68b7f" - integrity sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.10, csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -cubic-hermite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" - integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - -cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" - integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= - dependencies: - uniq "^1.0.0" - -d3-array@1, d3-array@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -d3-collection@1, d3-collection@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -d3-force@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-hierarchy@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-interpolate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -d3@^3.5.17: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -date-fns@^2.27.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== - -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - -date-format@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" - integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-equal@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" - integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== - dependencies: - call-bind "^1.0.0" - es-get-iterator "^1.1.1" - get-intrinsic "^1.0.1" - is-arguments "^1.0.4" - is-date-object "^1.0.2" - is-regex "^1.1.1" - isarray "^2.0.5" - object-is "^1.1.4" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.3" - which-boxed-primitive "^1.0.1" - which-collection "^1.0.1" - which-typed-array "^1.1.2" - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-gateway@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delaunay-triangulate@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" - integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= - dependencies: - incremental-convex-hull "^1.0.1" - uniq "^1.0.1" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-kerning@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" - integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -dom-helpers@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domhandler@^4.0, domhandler@^4.2.0, domhandler@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" - integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -double-bits@^1.1.0, double-bits@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" - integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= - -draw-svg-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" - integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= - dependencies: - abs-svg-path "~0.1.1" - normalize-svg-path "~0.1.0" - -dtype@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" - integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= - -dukat@0.5.8-rc.4: - version "0.5.8-rc.4" - resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" - integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== - dependencies: - google-protobuf "3.12.2" - typescript "3.9.5" - -dup@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" - integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -duplexify@^3.4.5: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -earcut@^2.1.5, earcut@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" - integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== - -edges-to-adjacency-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" - integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= - dependencies: - uniq "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.896: - version "1.4.5" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz#912e8fd1645edee2f0f212558f40916eb538b1f9" - integrity sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw== - -element-resize-detector@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" - integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== - dependencies: - batch-processor "1.0.0" - -element-size@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" - integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= - -elementary-circuits-directed-graph@^1.0.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" - integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== - dependencies: - strongly-connected-components "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-parser@~4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" - integrity sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA== - dependencies: - base64-arraybuffer "0.1.4" - -engine.io@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" - integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~4.0.0" - ws "~7.4.2" - -enhanced-resolve@^3.1.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-get-iterator@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.5" - isarray "^2.0.5" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-iterator@^2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.0.3, es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-react-hooks@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" - integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-frustum-planes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" - integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= - -extricate-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extricate-loader/-/extricate-loader-3.0.0.tgz#7a9998e885046d5d6991d62d4887ee113ca1e0bd" - integrity sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg== - dependencies: - loader-utils "^1.1.0" - -falafel@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" - integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== - dependencies: - acorn "^7.1.1" - foreach "^2.0.5" - isarray "^2.0.1" - object-keys "^1.0.6" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-isnumeric@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" - integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== - dependencies: - is-string-blank "^1.0.1" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastdom@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.10.tgz#4f2c7c9b24e7e249fc70c63131842b859b92bf09" - integrity sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A== - dependencies: - strictdom "^1.0.1" - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-saver@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a" - integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filtered-vector@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.5.tgz#5a831278c159721dd3be34ef017842836ef3d461" - integrity sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw== - dependencies: - binary-search-bounds "^2.0.0" - cubic-hermite "^1.0.0" - -finalhandler@1.1.2, finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatten-vertex-data@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" - integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== - dependencies: - dtype "^2.0.0" - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flip-pixels@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" - integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== - -focus-trap@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" - integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== - dependencies: - tabbable "^5.2.1" - -focus-visible@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" - integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== - -follow-redirects@^1.0.0: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== - -font-atlas@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" - integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== - dependencies: - css-font "^1.0.0" - -font-measure@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" - integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== - dependencies: - css-font "^1.2.0" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -format-util@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" - integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gamma@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" - integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -geojson-vt@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" - integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-canvas-context@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" - integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= - -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -gl-axes3d@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" - integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== - dependencies: - bit-twiddle "^1.0.2" - dup "^1.0.0" - extract-frustum-planes "^1.0.0" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-state "^1.0.0" - gl-vao "^1.3.0" - gl-vec4 "^1.0.1" - glslify "^7.0.0" - robust-orientation "^1.1.3" - split-polygon "^1.0.0" - vectorize-text "^3.2.1" - -gl-buffer@^2.1.1, gl-buffer@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" - integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= - dependencies: - ndarray "^1.0.15" - ndarray-ops "^1.1.0" - typedarray-pool "^1.0.0" - -gl-cone3d@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" - integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== - dependencies: - colormap "^2.3.1" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - gl-vec3 "^1.1.3" - glsl-inverse "^1.0.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - ndarray "^1.0.18" - -gl-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" - integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= - -gl-contour2d@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.7.tgz#ca330cf8449673a9ca0b3f6726c83f8d35c7a50c" - integrity sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw== - dependencies: - binary-search-bounds "^2.0.4" - cdt2d "^1.0.0" - clean-pslg "^1.1.2" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - iota-array "^1.0.0" - ndarray "^1.0.18" - surface-nets "^1.0.2" - -gl-error3d@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" - integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - -gl-fbo@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" - integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= - dependencies: - gl-texture2d "^2.0.0" - -gl-format-compiler-error@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" - integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= - dependencies: - add-line-numbers "^1.0.1" - gl-constants "^1.0.0" - glsl-shader-name "^1.0.0" - sprintf-js "^1.0.3" - -gl-heatmap2d@^1.0.6: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz#dbbb2c288bfe277002fa50985155b0403d87640f" - integrity sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - iota-array "^1.0.0" - typedarray-pool "^1.2.0" - -gl-line3d@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" - integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - ndarray "^1.0.18" - -gl-mat3@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" - integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= - -gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" - integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== - -gl-matrix@^3.2.1: - version "3.4.3" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" - integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== - -gl-mesh3d@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" - integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== - dependencies: - barycentric "^1.0.1" - colormap "^2.3.1" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - ndarray "^1.0.18" - normals "^1.1.0" - polytope-closest-point "^1.0.0" - simplicial-complex-contour "^1.0.2" - typedarray-pool "^1.1.0" - -gl-plot2d@^1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" - integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-select-static "^2.0.7" - gl-shader "^4.2.1" - glsl-inverse "^1.0.0" - glslify "^7.0.0" - text-cache "^4.2.2" - -gl-plot3d@^2.4.6: - version "2.4.7" - resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.7.tgz#b66e18c5affdd664f42c884acf7b82c60b41ee78" - integrity sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg== - dependencies: - "3d-view" "^2.0.0" - a-big-triangle "^1.0.3" - gl-axes3d "^1.5.3" - gl-fbo "^2.0.5" - gl-mat4 "^1.2.0" - gl-select-static "^2.0.7" - gl-shader "^4.2.1" - gl-spikes3d "^1.0.10" - glslify "^7.0.0" - has-passive-events "^1.0.0" - is-mobile "^2.2.1" - mouse-change "^1.4.0" - mouse-event-offset "^3.0.2" - mouse-wheel "^1.2.0" - ndarray "^1.0.19" - right-now "^1.0.0" - -gl-pointcloud2d@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" - integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - typedarray-pool "^1.1.0" - -gl-quat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" - integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= - dependencies: - gl-mat3 "^1.0.0" - gl-vec3 "^1.0.3" - gl-vec4 "^1.0.0" - -gl-scatter3d@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" - integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== - dependencies: - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - is-string-blank "^1.0.1" - typedarray-pool "^1.1.0" - vectorize-text "^3.2.1" - -gl-select-box@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" - integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - -gl-select-static@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" - integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== - dependencies: - bit-twiddle "^1.0.2" - gl-fbo "^2.0.5" - ndarray "^1.0.18" - typedarray-pool "^1.1.0" - -gl-shader@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.3.1.tgz#56094cf3c06e802ac6c286b3b2166abce901d882" - integrity sha512-xLoN6XtRLlg97SEqtuzfKc+pVWpVkQ3YjDI1kuCale8tF7+zMhiKlMfmG4IMQPMdKJZQbIc/Ny8ZusEpfh5U+w== - dependencies: - gl-format-compiler-error "^1.0.2" - weakmap-shim "^1.1.0" - -gl-spikes2d@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" - integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== - -gl-spikes3d@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" - integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glslify "^7.0.0" - -gl-state@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" - integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= - dependencies: - uniq "^1.0.0" - -gl-streamtube3d@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" - integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== - dependencies: - gl-cone3d "^1.5.2" - gl-vec3 "^1.1.3" - gl-vec4 "^1.0.1" - glsl-inverse "^1.0.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - -gl-surface3d@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.6.0.tgz#5fc915759a91e9962dcfbf3982296c462a032526" - integrity sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A== - dependencies: - binary-search-bounds "^2.0.4" - bit-twiddle "^1.0.2" - colormap "^2.3.1" - dup "^1.0.0" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glsl-specular-beckmann "^1.1.2" - glslify "^7.0.0" - ndarray "^1.0.18" - ndarray-gradient "^1.0.0" - ndarray-ops "^1.2.2" - ndarray-pack "^1.2.1" - ndarray-scratch "^1.2.0" - surface-nets "^1.0.2" - typedarray-pool "^1.1.0" - -gl-text@^1.1.8: - version "1.3.1" - resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" - integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== - dependencies: - bit-twiddle "^1.0.2" - color-normalize "^1.5.0" - css-font "^1.2.0" - detect-kerning "^2.1.2" - es6-weak-map "^2.0.3" - flatten-vertex-data "^1.0.2" - font-atlas "^2.1.0" - font-measure "^1.2.2" - gl-util "^3.1.2" - is-plain-obj "^1.1.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - parse-unit "^1.0.1" - pick-by-alias "^1.2.0" - regl "^2.0.0" - to-px "^1.0.1" - typedarray-pool "^1.1.0" - -gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" - integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= - dependencies: - ndarray "^1.0.15" - ndarray-ops "^1.2.2" - typedarray-pool "^1.1.0" - -gl-util@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" - integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== - dependencies: - is-browser "^2.0.1" - is-firefox "^1.0.3" - is-plain-obj "^1.1.0" - number-is-integer "^1.0.1" - object-assign "^4.1.0" - pick-by-alias "^1.2.0" - weak-map "^1.0.5" - -gl-vao@^1.2.0, gl-vao@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" - integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= - -gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" - integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== - -gl-vec4@^1.0.0, gl-vec4@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" - integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -glsl-inject-defines@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" - integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= - dependencies: - glsl-token-inject-block "^1.0.0" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glsl-inverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" - integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= - -glsl-out-of-range@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" - integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== - -glsl-resolve@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" - integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= - dependencies: - resolve "^0.6.1" - xtend "^2.1.2" - -glsl-shader-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" - integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= - dependencies: - atob-lite "^1.0.0" - glsl-tokenizer "^2.0.2" - -glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" - integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= - -glsl-specular-cook-torrance@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" - integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= - dependencies: - glsl-specular-beckmann "^1.1.1" - -glsl-token-assignments@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" - integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= - -glsl-token-defines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" - integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= - dependencies: - glsl-tokenizer "^2.0.0" - -glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" - integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= - -glsl-token-descope@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" - integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= - dependencies: - glsl-token-assignments "^2.0.0" - glsl-token-depth "^1.1.0" - glsl-token-properties "^1.0.0" - glsl-token-scope "^1.1.0" - -glsl-token-inject-block@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" - integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= - -glsl-token-properties@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" - integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= - -glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" - integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= - -glsl-token-string@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" - integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= - -glsl-token-whitespace-trim@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" - integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= - -glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" - integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== - dependencies: - through2 "^0.6.3" - -glslify-bundle@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" - integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== - dependencies: - glsl-inject-defines "^1.0.1" - glsl-token-defines "^1.0.0" - glsl-token-depth "^1.1.1" - glsl-token-descope "^1.0.2" - glsl-token-scope "^1.1.1" - glsl-token-string "^1.0.1" - glsl-token-whitespace-trim "^1.0.0" - glsl-tokenizer "^2.0.2" - murmurhash-js "^1.0.0" - shallow-copy "0.0.1" - -glslify-deps@^1.2.5: - version "1.3.2" - resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" - integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== - dependencies: - "@choojs/findup" "^0.2.0" - events "^3.2.0" - glsl-resolve "0.0.1" - glsl-tokenizer "^2.0.0" - graceful-fs "^4.1.2" - inherits "^2.0.1" - map-limit "0.0.1" - resolve "^1.0.0" - -glslify@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" - integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== - dependencies: - bl "^2.2.1" - concat-stream "^1.5.2" - duplexify "^3.4.5" - falafel "^2.1.0" - from2 "^2.3.0" - glsl-resolve "0.0.1" - glsl-token-whitespace-trim "^1.0.0" - glslify-bundle "^5.0.0" - glslify-deps "^1.2.5" - minimist "^1.2.5" - resolve "^1.1.5" - stack-trace "0.0.9" - static-eval "^2.0.5" - through2 "^2.0.1" - xtend "^4.0.0" - -google-protobuf@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" - integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -grid-index@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" - integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-hover@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" - integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= - dependencies: - is-browser "^2.0.1" - -has-passive-events@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" - integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== - dependencies: - is-browser "^2.0.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0, he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - -highlight.js@^10.7.2: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hoist-non-react-statics@^3.0.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsluv@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" - integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= - -html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -html-loader@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-3.0.1.tgz#84d9094d7fc2e3fcd871d1524736953742758585" - integrity sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA== - dependencies: - html-minifier-terser "^6.0.2" - parse5 "^6.0.1" - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-to-react@^1.3.4: - version "1.4.7" - resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.7.tgz#a58129c1b77c6d4e047a647372bd194e25420b89" - integrity sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g== - dependencies: - domhandler "^4.0" - htmlparser2 "^7.0" - lodash.camelcase "^4.3.0" - ramda "^0.27.1" - -htmlparser2@^7.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" - integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.2" - domutils "^2.8.0" - entities "^3.0.1" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-middleware@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" - integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.12: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -image-palette@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" - integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== - dependencies: - color-id "^1.1.0" - pxls "^2.0.0" - quantize "^1.0.2" - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -incremental-convex-hull@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" - integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= - dependencies: - robust-orientation "^1.1.2" - simplicial-complex "^1.0.0" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inline-style-prefixer@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz#c5c0e43ba8831707afc5f5bbfd97edf45c1fa7ae" - integrity sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ== - dependencies: - css-in-js-utils "^2.0.0" - -internal-ip@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" - integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== - dependencies: - default-gateway "^6.0.0" - ipaddr.js "^1.9.1" - is-ip "^3.1.0" - p-event "^4.2.0" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpolate-loader@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/interpolate-loader/-/interpolate-loader-2.0.1.tgz#bdf0092a3d4732842ac29c20bd03f1fb34891705" - integrity sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA== - dependencies: - escape-string-regexp "^2.0.0" - loader-utils "^1.1.0" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -interval-tree-1d@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz#b44f657de7ddae69ea3f98e0a9ad4bb046b07d11" - integrity sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ== - dependencies: - binary-search-bounds "^2.0.0" - -invert-permutation@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" - integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= - -iota-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" - integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4, is-arguments@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-base64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" - integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-blob@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" - integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-browser@^2.0.1, is-browser@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" - integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== - -is-buffer@^1.0.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.0, is-buffer@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1, is-date-object@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-firefox@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" - integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= - -is-float-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" - integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-iexplorer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" - integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= - -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-mobile@^2.2.1, is-mobile@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" - integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" - integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.1, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string-blank@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" - integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-svg-path@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" - integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url-superb@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" - integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-weakset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" - integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@^2.0.1, isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isbinaryfile@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -jest-worker@^27.0.6: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.0.tgz#fa10dddc611cbb47a4153543dd16a0c7e7fd745c" - integrity sha512-4WuKcUxtzxBoKOUFbt1MtTY9fJwPVD4aN/4Cgxee7OLetPZn5as2bjfZz98XSf2Zq1JFfhqPZpS+43BmWXKgCA== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jquery@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -just-debounce-it@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/just-debounce-it/-/just-debounce-it-3.0.1.tgz#8c8a4c9327c9523366ec79ac9a959a938153bd2f" - integrity sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg== - -karma-chrome-launcher@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" - integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" - integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== - dependencies: - graceful-fs "^4.1.2" - -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - webpack-merge "^4.1.5" - -karma@6.3.4: - version "6.3.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" - integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== - dependencies: - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - colors "^1.4.0" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.3.0" - mime "^2.5.2" - minimatch "^3.0.4" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^3.1.0" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.28" - yargs "^16.1.1" - -kdbush@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" - integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -lerp@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" - integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -loader-utils@^1.1.0, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" - integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== - dependencies: - date-format "^3.0.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.4" - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.25.3: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-limit@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" - integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= - dependencies: - once "~1.3.0" - -mapbox-gl@1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" - integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== - dependencies: - "@mapbox/geojson-rewind" "^0.5.0" - "@mapbox/geojson-types" "^1.0.2" - "@mapbox/jsonlint-lines-primitives" "^2.0.2" - "@mapbox/mapbox-gl-supported" "^1.5.0" - "@mapbox/point-geometry" "^0.1.0" - "@mapbox/tiny-sdf" "^1.1.1" - "@mapbox/unitbezier" "^0.0.0" - "@mapbox/vector-tile" "^1.3.1" - "@mapbox/whoots-js" "^3.1.0" - csscolorparser "~1.0.3" - earcut "^2.2.2" - geojson-vt "^3.2.1" - gl-matrix "^3.2.1" - grid-index "^1.1.0" - minimist "^1.2.5" - murmurhash-js "^1.0.0" - pbf "^3.2.1" - potpack "^1.0.1" - quickselect "^2.0.0" - rw "^1.3.3" - supercluster "^7.0.0" - tinyqueue "^2.0.3" - vt-pbf "^3.1.1" - -marching-simplex-table@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" - integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= - dependencies: - convex-hull "^1.0.3" - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - -mat4-decompose@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" - integrity sha1-ZetP451wh496RE60Yk1S9+frL68= - dependencies: - gl-mat4 "^1.0.1" - gl-vec3 "^1.0.2" - -mat4-interpolate@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" - integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= - dependencies: - gl-mat4 "^1.0.1" - gl-vec3 "^1.0.2" - mat4-decompose "^1.0.3" - mat4-recompose "^1.0.3" - quat-slerp "^1.0.0" - -mat4-recompose@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" - integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= - dependencies: - gl-mat4 "^1.0.1" - -math-log2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" - integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= - -matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz#d316ae5e99fe801610c1d7842ab54566d4c62411" - integrity sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA== - dependencies: - binary-search-bounds "^2.0.0" - gl-mat4 "^1.1.2" - gl-vec3 "^1.0.3" - mat4-interpolate "^1.0.3" - -mdast-add-list-metadata@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" - integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== - dependencies: - unist-util-visit-parents "1.1.2" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-gfm-autolink-literal@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memfs@^3.2.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" - integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== - dependencies: - fs-monkey "1.0.3" - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -memory-fs@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.2.tgz#93f53175b0f0dc4014bd2d612218fccfcf3534d3" - integrity sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.2" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.7" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.25" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.1.5" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -monotone-convex-hull-2d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" - integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= - dependencies: - robust-orientation "^1.1.3" - -mouse-change@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" - integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= - dependencies: - mouse-event "^1.0.0" - -mouse-event-offset@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" - integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= - -mouse-event@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" - integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= - -mouse-wheel@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" - integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= - dependencies: - right-now "^1.0.0" - signum "^1.0.0" - to-px "^1.0.1" - -mrmime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" - integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mumath@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" - integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= - dependencies: - almost-equal "^1.1.0" - -murmurhash-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" - integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= - -nanoid@3.1.25: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== - -nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -ndarray-extract-contour@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" - integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= - dependencies: - typedarray-pool "^1.0.0" - -ndarray-gradient@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.1.tgz#16126a78ac241162248224aa662b6db6a5885402" - integrity sha512-+xONVi7xxTCGL6KOb11Yyoe0tPNqAUKF39CvFoRjL5pdOmPd2G2pckK9lD5bpLF3q45LLnYNyiUSJSdNmQ2MTg== - dependencies: - cwise-compiler "^1.0.0" - dup "^1.0.0" - -ndarray-linear-interpolate@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" - integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= - -ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" - integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= - dependencies: - cwise-compiler "^1.0.0" - -ndarray-pack@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" - integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= - dependencies: - cwise-compiler "^1.1.2" - ndarray "^1.0.13" - -ndarray-scratch@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" - integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= - dependencies: - ndarray "^1.0.14" - ndarray-ops "^1.2.1" - typedarray-pool "^1.0.2" - -ndarray-sort@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" - integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= - dependencies: - typedarray-pool "^1.0.0" - -ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" - integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== - dependencies: - iota-array "^1.0.0" - is-buffer "^1.0.2" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nextafter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" - integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= - dependencies: - double-bits "^1.1.0" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-svg-path@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" - integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== - dependencies: - svg-arc-to-cubic-bezier "^3.0.0" - -normalize-svg-path@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" - integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= - -normals@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" - integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -number-is-integer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" - integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= - dependencies: - is-finite "^1.0.1" - -numeric@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" - integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-is@^1.0.1, object-is@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -orbit-camera-controller@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" - integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= - dependencies: - filtered-vector "^1.2.1" - gl-mat4 "^1.0.3" - -os-homedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" - integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== - -p-event@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pad-left@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" - integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= - dependencies: - repeat-string "^1.3.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parenthesis@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.8.tgz#3457fccb8f05db27572b841dad9d2630b912f125" - integrity sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-rect@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" - integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== - dependencies: - pick-by-alias "^1.2.0" - -parse-svg-path@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" - integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= - -parse-unit@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" - integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbf@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" - integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== - dependencies: - ieee754 "^1.1.12" - resolve-protobuf-schema "^2.1.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -permutation-parity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" - integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= - dependencies: - typedarray-pool "^1.0.0" - -permutation-rank@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" - integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= - dependencies: - invert-permutation "^1.0.0" - typedarray-pool "^1.0.0" - -pick-by-alias@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" - integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -planar-dual@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" - integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= - dependencies: - compare-angle "^1.0.0" - dup "^1.0.0" - -planar-graph-to-polyline@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz#ed300620c33001ee2cca0ac6d1dae8d02d23f009" - integrity sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA== - dependencies: - edges-to-adjacency-list "^1.0.0" - planar-dual "^1.0.0" - point-in-big-polygon "^2.0.1" - robust-orientation "^1.0.1" - robust-sum "^1.0.0" - two-product "^1.0.0" - uniq "^1.0.0" - -plotly.js@1.54.6: - version "1.54.6" - resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.54.6.tgz#ed021aa8da85759c69602c97bd3dab2b09eeec22" - integrity sha512-z6FDeo/O4iNN+TfKJvk3Sv+MS7prFfM6oLJK5q9TYpwIQEz8oOtxwKQJospqtKub6mvxOhPoDIxxmpDZeiNopQ== - dependencies: - "@plotly/d3-sankey" "0.7.2" - "@plotly/d3-sankey-circular" "0.33.1" - "@turf/area" "^6.0.1" - "@turf/bbox" "^6.0.1" - "@turf/centroid" "^6.0.2" - alpha-shape "^1.0.0" - canvas-fit "^1.5.0" - color-normalize "^1.5.0" - color-rgba "^2.1.1" - convex-hull "^1.0.3" - country-regex "^1.1.0" - d3 "^3.5.17" - d3-force "^1.2.1" - d3-hierarchy "^1.1.9" - d3-interpolate "^1.4.0" - delaunay-triangulate "^1.1.6" - es6-promise "^4.2.8" - fast-isnumeric "^1.1.4" - gl-cone3d "^1.5.2" - gl-contour2d "^1.1.7" - gl-error3d "^1.0.16" - gl-heatmap2d "^1.0.6" - gl-line3d "1.2.1" - gl-mat4 "^1.2.0" - gl-mesh3d "^2.3.1" - gl-plot2d "^1.4.5" - gl-plot3d "^2.4.6" - gl-pointcloud2d "^1.0.3" - gl-scatter3d "^1.2.3" - gl-select-box "^1.0.4" - gl-spikes2d "^1.0.2" - gl-streamtube3d "^1.4.1" - gl-surface3d "^1.5.2" - gl-text "^1.1.8" - glslify "^7.0.0" - has-hover "^1.0.1" - has-passive-events "^1.0.0" - is-mobile "^2.2.2" - mapbox-gl "1.10.1" - matrix-camera-controller "^2.1.3" - mouse-change "^1.4.0" - mouse-event-offset "^3.0.2" - mouse-wheel "^1.2.0" - ndarray "^1.0.19" - ndarray-linear-interpolate "^1.0.0" - parse-svg-path "^0.1.2" - point-cluster "^3.1.8" - polybooljs "^1.2.0" - regl "^1.6.1" - regl-error2d "^2.0.8" - regl-line2d "^3.0.15" - regl-scatter2d "^3.1.8" - regl-splom "^1.0.8" - right-now "^1.0.0" - robust-orientation "^1.1.3" - sane-topojson "^4.0.0" - strongly-connected-components "^1.0.1" - superscript-text "^1.0.0" - svg-path-sdf "^1.1.3" - tinycolor2 "^1.4.1" - to-px "1.0.1" - topojson-client "^3.1.0" - webgl-context "^2.2.0" - world-calendars "^1.0.3" - -point-cluster@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.8.tgz#a63625fd8964f2a5b446025a1acf8bcac42500c0" - integrity sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ== - dependencies: - array-bounds "^1.0.1" - array-normalize "^1.1.4" - binary-search-bounds "^2.0.4" - bubleify "^1.1.0" - clamp "^1.0.1" - defined "^1.0.0" - dtype "^2.0.0" - flatten-vertex-data "^1.0.2" - is-obj "^1.0.1" - math-log2 "^1.0.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - -point-in-big-polygon@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz#69d293010cead58af08c3082ad1d23f600ef10af" - integrity sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q== - dependencies: - binary-search-bounds "^2.0.0" - interval-tree-1d "^1.0.1" - robust-orientation "^1.1.3" - slab-decomposition "^1.0.1" - -polybooljs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" - integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= - -polytope-closest-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" - integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= - dependencies: - numeric "^1.2.6" - -popper.js@1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -postcss-attribute-case-insensitive@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" - integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== - dependencies: - postcss-selector-parser "^6.0.2" - -postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== - dependencies: - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz#2fd769959e7fe658b4c0e7d40b0ab245fc8664f1" - integrity sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w== - dependencies: - postcss-values-parser "6.0.1" - -postcss-color-hex-alpha@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz#84bfd985a93b0a18e047ebcb5fd463e2cae5e7a6" - integrity sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw== - dependencies: - postcss-values-parser "^6.0.0" - -postcss-color-rebeccapurple@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz#980fbd98eb68ebbb38be02a82c7554e043c8fdf4" - integrity sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA== - dependencies: - postcss-values-parser "^6" - -postcss-custom-media@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" - integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== - -postcss-custom-properties@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz#fd01ec9bd1462336ea8af7ba3c1a2c47c203031e" - integrity sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ== - dependencies: - postcss-values-parser "^6" - -postcss-custom-selectors@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" - integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz#7026a070a4849072a232eaf0cdd960de3013658d" - integrity sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA== - dependencies: - postcss-selector-parser "6.0.6" - -postcss-double-position-gradients@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz#3c21ad52b6f13d81caf2563b0010a2c5872272af" - integrity sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw== - dependencies: - postcss-values-parser "6.0.1" - -postcss-env-function@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.2.tgz#5509d008ff0f069fa18bd2eace4f3fdb18150c28" - integrity sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg== - dependencies: - postcss-values-parser "6.0.1" - -postcss-flexbugs-fixes@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" - integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== - -postcss-focus-visible@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz#b12a859616eca7152976fec24ef337ab29bbc405" - integrity sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q== - -postcss-focus-within@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz#615659122325d86e00bc8ed84ab6129d0b3a0f62" - integrity sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg== - -postcss-font-family-system-ui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz#cceb13dccb11019e9d6246db9a93137a30a53e21" - integrity sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.30000655" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz#8941c400df902247603fd915c7dc81e1d7686b15" - integrity sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og== - -postcss-image-set-function@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz#95b64db01b8812fcbece3bb36a3f2b8133bf7c91" - integrity sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A== - dependencies: - postcss-values-parser "6.0.1" - -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-lab-function@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz#b6a1fb1032ddd7f4f7198ca78ec84c9b5bc7d80e" - integrity sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w== - dependencies: - "@csstools/convert-colors" "2.0.0" - postcss-values-parser "6.0.1" - -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-logical@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.0.tgz#f646ef6a3562890e1123a32e695d14cc271afb21" - integrity sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values-replace@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz#259192a73a291888816edb93934dd7177fb877ac" - integrity sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw== - dependencies: - enhanced-resolve "^3.1.0" - es6-promisify "^5.0.0" - icss-utils "^4.0.0" - loader-utils "^2.0.0" - postcss "^7.0.0" - postcss-values-parser "^1.3.1" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nesting@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.0.2.tgz#0cf9e81712fe7b6c3005e7d884cce2cb0a06326e" - integrity sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA== - dependencies: - postcss-selector-parser "6.0.6" - -postcss-overflow-shorthand@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz#f57631672333b302ffdcfc0735b8b7d0244c2a25" - integrity sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw== - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.1.tgz#9fbd18b3d1d438d313b2a29f5a50424c8ebca28d" - integrity sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ== - dependencies: - postcss-values-parser "6.0.1" - -postcss-preset-env@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz#7f1fc5ac38e60a8e5ff9a920396d936a830e6120" - integrity sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA== - dependencies: - autoprefixer "^10.4.0" - browserslist "^4.17.5" - caniuse-lite "^1.0.30001272" - css-blank-pseudo "^2.0.0" - css-has-pseudo "^2.0.0" - css-prefers-color-scheme "^5.0.0" - cssdb "^5.0.0" - postcss "^8.3" - postcss-attribute-case-insensitive "^5.0.0" - postcss-color-functional-notation "^4.0.1" - postcss-color-hex-alpha "^8.0.0" - postcss-color-rebeccapurple "^7.0.0" - postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.0.0" - postcss-custom-selectors "^6.0.0" - postcss-dir-pseudo-class "^6.0.0" - postcss-double-position-gradients "^3.0.1" - postcss-env-function "^4.0.2" - postcss-focus-visible "^6.0.1" - postcss-focus-within "^5.0.1" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.0" - postcss-image-set-function "^4.0.2" - postcss-initial "^4.0.1" - postcss-lab-function "^4.0.1" - postcss-logical "^5.0.0" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.0.2" - postcss-overflow-shorthand "^3.0.0" - postcss-page-break "^3.0.4" - postcss-place "^7.0.1" - postcss-pseudo-class-any-link "^7.0.0" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^5.0.0" - -postcss-pseudo-class-any-link@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz#b06483c8a241cee1e420f9ebd08680d4f95b2b20" - integrity sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ== - dependencies: - postcss-selector-parser "^6" - -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" - integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== - dependencies: - balanced-match "^1.0.0" - -postcss-selector-parser@6.0.6, postcss-selector-parser@^6, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-values-parser@6.0.1, postcss-values-parser@^6, postcss-values-parser@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz#aeb5e4522c4aabeb1ebbb14122194b9c08069675" - integrity sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q== - dependencies: - color-name "^1.1.4" - is-url-superb "^4.0.0" - quote-unquote "^1.0.0" - -postcss-values-parser@^1.3.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" - integrity sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@^6.0.1: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -postcss@^7.0.0, postcss@^7.0.14: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.2.15, postcss@^8.3: - version "8.4.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" - integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - -postcss@^8.4.4: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - -potpack@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" - integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== - -prefixfree@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prefixfree/-/prefixfree-1.0.0.tgz#82b0edbbac107f2a3e2dc569d6c3df4035cd7910" - integrity sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.0.0, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pxls@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" - integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== - dependencies: - arr-flatten "^1.1.0" - compute-dims "^1.1.0" - flip-pixels "^1.0.2" - is-browser "^2.1.0" - is-buffer "^2.0.3" - to-uint8 "^1.4.1" - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -quantize@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" - integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= - -quat-slerp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" - integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= - dependencies: - gl-quat "^1.0.0" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quickselect@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" - integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== - -quote-unquote@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" - integrity sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs= - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -rat-vec@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" - integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= - dependencies: - big-rat "^1.0.3" - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-file-drop@3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/react-file-drop/-/react-file-drop-3.0.6.tgz#7fb75bdc0e9a10be4f6c653d2a906cacdd460d3e" - integrity sha512-OXfSpA8YY/OsKNITXPAOr+Rar8izqNZkx/N7B5vkp00AhQOFvj8ctC4bWInq1Mzpm4De5+XfpXAYbj4D4ze1QA== - dependencies: - prop-types "^15.7.2" - -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-markdown@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac" - integrity sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w== - dependencies: - "@types/mdast" "^3.0.3" - "@types/unist" "^2.0.3" - html-to-react "^1.3.4" - mdast-add-list-metadata "1.0.1" - prop-types "^15.7.2" - react-is "^16.8.6" - remark-parse "^9.0.0" - unified "^9.0.0" - unist-util-visit "^2.0.0" - xtend "^4.0.1" - -react-movable@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-movable/-/react-movable-3.0.2.tgz#45e6bd95db9f8340a114ddc8860dc9994719e94a" - integrity sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA== - -react-virtualized@^9.22.3: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== - dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" - -react-waypoint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/react-waypoint/-/react-waypoint-10.1.0.tgz#6ab522a61bd52946260e4a78b3182759a97b40ec" - integrity sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q== - dependencies: - "@babel/runtime" "^7.12.5" - consolidated-events "^1.1.0 || ^2.0.0" - prop-types "^15.0.0" - react-is "^17.0.1" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -reduce-simplicial-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" - integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= - dependencies: - cell-orientation "^1.0.1" - compare-cell "^1.0.0" - compare-oriented-cell "^1.0.1" - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" - integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpu-core@^4.5.4, regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - -regl-error2d@^2.0.8: - version "2.0.12" - resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" - integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== - dependencies: - array-bounds "^1.0.1" - color-normalize "^1.5.0" - flatten-vertex-data "^1.0.2" - object-assign "^4.1.1" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - update-diff "^1.1.0" - -regl-line2d@^3.0.15: - version "3.1.2" - resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" - integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== - dependencies: - array-bounds "^1.0.1" - array-find-index "^1.0.2" - array-normalize "^1.1.4" - color-normalize "^1.5.0" - earcut "^2.1.5" - es6-weak-map "^2.0.3" - flatten-vertex-data "^1.0.2" - glslify "^7.0.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - -regl-scatter2d@^3.1.8, regl-scatter2d@^3.2.3: - version "3.2.8" - resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz#a1360e803e3fdf628ca09a72a435a0b7d4cf5675" - integrity sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig== - dependencies: - "@plotly/point-cluster" "^3.1.9" - array-range "^1.0.1" - array-rearrange "^2.2.2" - clamp "^1.0.1" - color-id "^1.1.0" - color-normalize "^1.5.0" - color-rgba "^2.1.1" - flatten-vertex-data "^1.0.2" - glslify "^7.0.0" - image-palette "^2.1.0" - is-iexplorer "^1.0.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - update-diff "^1.1.0" - -regl-splom@^1.0.8: - version "1.0.14" - resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" - integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== - dependencies: - array-bounds "^1.0.1" - array-range "^1.0.1" - color-alpha "^1.0.4" - flatten-vertex-data "^1.0.2" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - raf "^3.4.1" - regl-scatter2d "^3.2.3" - -regl@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3" - integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w== - -regl@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" - integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remark-breaks@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.2.tgz#f466b9d3474d7323146c0149fc1496dabadd908e" - integrity sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw== - dependencies: - "@types/mdast" "^3.0.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - -remark-gfm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -repeat-string@^1.0.0, repeat-string@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-protobuf-schema@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" - integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== - dependencies: - protocol-buffers-schema "^3.3.1" - -resolve@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" - integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= - -resolve@^1.0.0, resolve@^1.1.5, resolve@^1.14.2, resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -right-now@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" - integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -robust-compress@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" - integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= - -robust-determinant@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" - integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= - dependencies: - robust-compress "^1.0.0" - robust-scale "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-dot-product@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" - integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= - dependencies: - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-in-sphere@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.2.1.tgz#ece3c2ae0fdf36b351680566adea7e93c6ba46da" - integrity sha512-3zJdcMIOP1gdwux93MKTS0RiMYEGwQBoE5R1IW/9ZQmGeZzP7f7i4+xdcK8ujJvF/dEOS1WPuI9IB1WNFbj3Cg== - dependencies: - robust-scale "^1.0.0" - robust-subtract "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-linear-solve@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" - integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= - dependencies: - robust-determinant "^1.1.0" - -robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.2.1.tgz#f6c2b00a5df5f1cb9597be63a45190f273899361" - integrity sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg== - dependencies: - robust-scale "^1.0.2" - robust-subtract "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.2" - -robust-product@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" - integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= - dependencies: - robust-scale "^1.0.0" - robust-sum "^1.0.0" - -robust-scale@^1.0.0, robust-scale@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" - integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= - dependencies: - two-product "^1.0.2" - two-sum "^1.0.0" - -robust-segment-intersect@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" - integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= - dependencies: - robust-orientation "^1.1.3" - -robust-subtract@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" - integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= - -robust-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" - integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane-topojson@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/sane-topojson/-/sane-topojson-4.0.0.tgz#624cdb26fc6d9392c806897bfd1a393f29bb5308" - integrity sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -scrollbar-width@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/scrollbar-width/-/scrollbar-width-3.1.1.tgz#c62e63efa5934dac37b43da34f7550caca8444a2" - integrity sha1-xi5j76WTTaw3tD2jT3VQysqERKI= - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.11: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallow-copy@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.3, side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -signum@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" - integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= - -signum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" - integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= - -simplicial-complex-boundary@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" - integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= - dependencies: - boundary-cells "^2.0.0" - reduce-simplicial-complex "^1.0.0" - -simplicial-complex-contour@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" - integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= - dependencies: - marching-simplex-table "^1.0.0" - ndarray "^1.0.15" - ndarray-sort "^1.0.0" - typedarray-pool "^1.1.0" - -simplicial-complex@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" - integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= - dependencies: - bit-twiddle "~0.0.1" - union-find "~0.0.3" - -simplicial-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" - integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= - dependencies: - bit-twiddle "^1.0.0" - union-find "^1.0.0" - -simplify-planar-graph@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" - integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= - dependencies: - robust-orientation "^1.0.1" - simplicial-complex "^0.3.3" - -simply-uuid@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simply-uuid/-/simply-uuid-1.0.1.tgz#539241d81528969cef23892faf4588005fa99ab8" - integrity sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg= - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -slab-decomposition@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.3.tgz#0345b3d364d78dad3f400cd5c8e0424547d23e7c" - integrity sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ== - dependencies: - binary-search-bounds "^2.0.0" - functional-red-black-tree "^1.0.0" - robust-orientation "^1.1.3" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -sniffr@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/sniffr/-/sniffr-1.2.0.tgz#d4e31073ef4f7c00d87dba89289736fba25cadb4" - integrity sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ== - -socket.io-adapter@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" - integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== - -socket.io-parser@~4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" - -socket.io@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" - integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== - dependencies: - "@types/cookie" "^0.4.0" - "@types/cors" "^2.8.8" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.1" - engine.io "~4.1.0" - socket.io-adapter "~2.1.0" - socket.io-parser "~4.0.3" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - -source-map-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" - integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== - -source-map-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" - integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.2" - source-map-js "^0.6.2" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sourcemap-codec@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-polygon@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" - integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= - dependencies: - robust-dot-product "^1.0.0" - robust-sum "^1.0.0" - -sprintf-js@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= - -static-eval@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" - integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== - dependencies: - escodegen "^1.11.1" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -streamroller@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" - integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== - dependencies: - date-format "^2.1.0" - debug "^4.1.1" - fs-extra "^8.1.0" - -strictdom@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" - integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= - -string-split-by@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" - integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== - dependencies: - parenthesis "^3.1.5" - -string-to-arraybuffer@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" - integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== - dependencies: - atob-lite "^2.0.0" - is-base64 "^0.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strongly-connected-components@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" - integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= - -style-inject@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" - integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== - -style-loader@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.0.tgz#d66ea95fc50b22f8b79b69a9e414760fcf58d8d8" - integrity sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ== - -style-loader@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -styled-components@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" - integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^0.8.8" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -supercluster@^7.0.0: - version "7.1.4" - resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" - integrity sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g== - dependencies: - kdbush "^3.0.0" - -superscript-text@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" - integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= - -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -surface-nets@^1.0.0, surface-nets@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" - integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= - dependencies: - ndarray-extract-contour "^1.0.0" - triangulate-hypercube "^1.0.0" - zero-crossings "^1.0.0" - -svg-arc-to-cubic-bezier@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" - integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== - -svg-path-bounds@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" - integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== - dependencies: - abs-svg-path "^0.1.1" - is-svg-path "^1.0.1" - normalize-svg-path "^1.0.0" - parse-svg-path "^0.1.2" - -svg-path-sdf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" - integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== - dependencies: - bitmap-sdf "^1.0.0" - draw-svg-path "^1.0.0" - is-svg-path "^1.0.1" - parse-svg-path "^0.1.2" - svg-path-bounds "^1.0.1" - -tabbable@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" - integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== - -tabulator-tables@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/tabulator-tables/-/tabulator-tables-5.0.1.tgz#c077de5da11ddca654a3132e908e80ff5f5382e2" - integrity sha512-zSPYzkLIBGwmAFEPOgUpXXNKzO95bVj6EKRikS0Em32gnfhSR9n73mN5TpQV1jU4nPv/pUUTbMZVVHrjzIaaJQ== - -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3: - version "5.2.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" - integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== - dependencies: - jest-worker "^27.0.6" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - -terser@^5.10.0, terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -text-cache@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" - integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== - dependencies: - vectorize-text "^3.2.1" - -three-csg-ts@3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/three-csg-ts/-/three-csg-ts-3.1.9.tgz#1438de3b6747b9b55deb88d9e0acdc6e47681979" - integrity sha512-Qke0+07AKDfeiRjh46sOF2iiilSMcKnfgHjuArdMB4poZs3X0FQLHGFIEBbGrv3ejrkHASW9o5pLRfFFQhk9hg== - -three@0.137.4: - version "0.137.4" - resolved "https://registry.yarnpkg.com/three/-/three-0.137.4.tgz#ec73b6a6c40b733d56544b13d0c3cdb0bce5d0a7" - integrity sha512-kUyOZNX+dMbvaS0mGYM1BaXHkHVNQdpryWH8dBg3mn725dJcTo9/5rjyH+OJ8V0r+XbZPz7sncV+c3Gjpc9UBA== - -through2@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== - -tinyqueue@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" - integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-array-buffer@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" - integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== - dependencies: - flatten-vertex-data "^1.0.2" - is-blob "^2.0.1" - string-to-arraybuffer "^1.0.0" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-float32@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" - integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== - -to-px@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" - integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= - dependencies: - parse-unit "^1.0.1" - -to-px@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" - integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== - dependencies: - parse-unit "^1.0.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-uint8@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" - integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== - dependencies: - arr-flatten "^1.1.0" - clamp "^1.0.1" - is-base64 "^0.1.0" - is-float-array "^1.0.0" - to-array-buffer "^3.0.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -topojson-client@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== - dependencies: - commander "2" - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -traverse@0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= - -triangulate-hypercube@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" - integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= - dependencies: - gamma "^0.1.0" - permutation-parity "^1.0.0" - permutation-rank "^1.0.0" - -triangulate-polyline@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" - integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= - dependencies: - cdt2d "^1.0.0" - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -trough@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" - integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -turntable-camera-controller@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" - integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= - dependencies: - filtered-vector "^1.2.1" - gl-mat4 "^1.0.2" - gl-vec3 "^1.0.2" - -two-product@^1.0.0, two-product@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" - integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= - -two-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" - integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type-name@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" - integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0, typedarray-pool@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" - integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== - dependencies: - bit-twiddle "^1.0.0" - dup "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@3.9.5: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== - -ua-parser-js@^0.7.28: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -unified@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.1.tgz#345e349e3ab353ab612878338eb9d57b4dea1d46" - integrity sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unified@^9.0.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -union-find@^1.0.0, union-find@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" - integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= - -union-find@~0.0.3: - version "0.0.4" - resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" - integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= - -uniq@^1.0.0, uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" - integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" - integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit-parents@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" - integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -unist-util-visit@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" - integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -update-diff@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" - integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-copy-error@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" - integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= - dependencies: - object-keys "^1.0.9" - utils-copy "^1.1.0" - -utils-copy@^1.0.0, utils-copy@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" - integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= - dependencies: - const-pinf-float64 "^1.0.0" - object-keys "^1.0.9" - type-name "^2.0.0" - utils-copy-error "^1.0.0" - utils-indexof "^1.0.0" - utils-regex-from-string "^1.0.0" - validate.io-array "^1.0.3" - validate.io-buffer "^1.0.1" - validate.io-nonnegative-integer "^1.0.0" - -utils-indexof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" - integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= - dependencies: - validate.io-array-like "^1.0.1" - validate.io-integer-primitive "^1.0.0" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -utils-regex-from-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" - integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= - dependencies: - regex-regex "^1.0.0" - validate.io-string-primitive "^1.0.0" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate.io-array-like@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" - integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= - dependencies: - const-max-uint32 "^1.0.2" - validate.io-integer-primitive "^1.0.0" - -validate.io-array@^1.0.3, validate.io-array@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= - -validate.io-buffer@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" - integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= - -validate.io-integer-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" - integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= - dependencies: - validate.io-number-primitive "^1.0.0" - -validate.io-integer@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" - integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= - dependencies: - validate.io-number "^1.0.3" - -validate.io-matrix-like@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" - integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= - -validate.io-ndarray-like@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" - integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= - -validate.io-nonnegative-integer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" - integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= - dependencies: - validate.io-integer "^1.0.5" - -validate.io-number-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" - integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= - -validate.io-number@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" - integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= - -validate.io-positive-integer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" - integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= - dependencies: - validate.io-integer "^1.0.5" - -validate.io-string-primitive@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" - integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vectorize-text@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.2.tgz#3e978889df4ae333975d38669529c942a63e1f65" - integrity sha512-34NVOCpMMQVXujU4vb/c6u98h6djI0jGdtC202H4Huvzn48B6ARsR7cmGh1xsAc0pHNQiUKGK/aHF05VtGv+eA== - dependencies: - cdt2d "^1.0.0" - clean-pslg "^1.1.0" - ndarray "^1.0.11" - planar-graph-to-polyline "^1.0.6" - simplify-planar-graph "^2.0.1" - surface-nets "^1.0.0" - triangulate-polyline "^1.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile-message@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74" - integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vfile@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.0.tgz#a32a646ff9251c274dbe8675644a39031025b369" - integrity sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -vt-pbf@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" - integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== - dependencies: - "@mapbox/point-geometry" "0.1.0" - "@mapbox/vector-tile" "^1.3.1" - pbf "^3.2.1" - -watchpack@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" - integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -weak-map@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" - integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= - -weakmap-shim@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" - integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= - -webgl-context@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" - integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= - dependencies: - get-canvas-context "^1.0.1" - -webpack-bundle-analyzer@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" - integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== - dependencies: - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-cli@4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.0.tgz#dc43e6e0f80dd52e89cbf73d5294bcd7ad6eb343" - integrity sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.0" - "@webpack-cli/info" "^1.4.0" - "@webpack-cli/serve" "^1.6.0" - colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - v8-compile-cache "^2.2.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" - integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.3.1.tgz#759d3337f0fbea297fbd1e433ab04ccfc000076b" - integrity sha512-qNXQCVYo1kYhH9pgLtm8LRNkXX3XzTfHSj/zqzaqYzGPca+Qjr+81wj1jgPMCHhIhso9WEQ+kX9z23iG9PzQ7w== - dependencies: - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.1" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - internal-ip "^6.2.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^3.1.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - url "^0.11.0" - webpack-dev-middleware "^5.2.1" - ws "^8.1.0" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" - integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== - -webpack@5.57.1: - version "5.57.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.57.1.tgz#ead5ace2c17ecef2ae8126f143bfeaa7f55eab44" - integrity sha512-kHszukYjTPVfCOEyrUthA3jqJwduY/P3eO8I0gMNOZGIQWKAwZftxmp5hq6paophvwo9NoUrcZOecs9ulOyyTg== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.2.0" - webpack-sources "^3.2.0" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" - integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== - -world-calendars@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" - integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= - dependencies: - object-assign "^4.1.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^7.3.1: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -ws@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" - integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== - -ws@~7.4.2: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" - integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zero-crossings@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" - integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= - dependencies: - cwise-compiler "^1.0.0" - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 53dee008..7d7564b5 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -5,7 +5,7 @@ plugins { val dataforgeVersion: String by rootProject.extra kotlin{ - js{ + js(IR){ useCommonJs() browser { commonWebpackConfig { diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index bfe711c8..1e9b59b9 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } kotlin { - js{ + js(IR){ binaries.library() } sourceSets { diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index ec77fa22..86234c10 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -4,7 +4,7 @@ plugins { dependencies { api(project(":visionforge-core")) - api(npmlibs.ktor.server.cio) - api(npmlibs.ktor.html.builder) - api(npmlibs.ktor.websockets) + api("io.ktor-server-cio:${npmlibs.versions.ktor}") + api("io.ktor:ktor-server-html-builder:${npmlibs.versions.ktor}") + api("io.ktor:ktor-server-websockets:${npmlibs.versions.ktor}") } \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 696b30cf..67e12b10 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -5,7 +5,7 @@ plugins { val ktorVersion: String by rootProject.extra kotlin { - js{ + js(IR){ browser { webpackTask { this.outputFileName = "js/visionforge-three.js" -- 2.34.1 From 3198bad094db205efca5bbfe6eecf89f149c4048 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 13 Apr 2022 17:08:25 +0300 Subject: [PATCH 071/143] Update build. --- .gitignore | 2 + CHANGELOG.md | 3 +- build.gradle.kts | 2 +- demo/muon-monitor/build.gradle.kts | 5 +- .../ru/mipt/npm/muon/monitor/MMServer.kt | 28 +++++----- demo/playground/build.gradle.kts | 2 +- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- .../visionforge/bootstrap/tabComponent.kt | 2 +- visionforge-server/build.gradle.kts | 9 ++-- .../visionforge/server/VisionServer.kt | 52 +++++++++---------- .../visionforge/tables/TableVisionJsPlugin.kt | 2 +- .../solid/three/ThreeLabelFactory.kt | 1 - 13 files changed, 55 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index 7fab40d3..6d07da58 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ build/ data/ !gradle-wrapper.jar + +/kotlin-js-store/yarn.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index d2cf0882..a59c31d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,11 @@ ## [Unreleased] ### Added +- Context receivers flag ### Changed - Naming of Canvas3D options -- Lights are added to the scene instead of 3D options +- Lights are added to the scene instead of 3D options ### Deprecated diff --git a/build.gradle.kts b/build.gradle.kts index c3148a64..3d983923 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ val fxVersion by extra("11") allprojects{ group = "space.kscience" - version = "0.2.1-dev-1" + version = "0.3.0-dev-1" } subprojects { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 59d3495a..f3b1710c 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -45,8 +45,9 @@ kotlin { jvmMain { dependencies { implementation("org.apache.commons:commons-math3:3.6.1") - implementation("io.ktor-server-cio:${npmlibs.versions.ktor}") - implementation("io.ktor:ktor-serialization-kotlinx-json:${npmlibs.versions.ktor}") + implementation("io.ktor:ktor-server-cio:${ktorVersion}") + implementation("io.ktor:ktor-server-content-negotiation:${ktorVersion}") + implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorVersion}") } } jsMain { diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt index 29abd7ca..aa533431 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt @@ -1,24 +1,22 @@ package ru.mipt.npm.muon.monitor.server -import io.ktor.application.Application -import io.ktor.application.call -import io.ktor.application.install -import io.ktor.application.log -import io.ktor.features.CallLogging -import io.ktor.features.ContentNegotiation -import io.ktor.features.DefaultHeaders import io.ktor.http.ContentType import io.ktor.http.HttpStatusCode -import io.ktor.http.content.resources -import io.ktor.http.content.static -import io.ktor.response.respond -import io.ktor.response.respondText -import io.ktor.routing.Routing -import io.ktor.routing.get -import io.ktor.serialization.json +import io.ktor.serialization.kotlinx.json.json +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.application.log import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer +import io.ktor.server.http.content.resources +import io.ktor.server.http.content.static +import io.ktor.server.plugins.contentnegotiation.ContentNegotiation +import io.ktor.server.response.respond +import io.ktor.server.response.respondText +import io.ktor.server.routing.Routing +import io.ktor.server.routing.get import org.apache.commons.math3.random.JDKRandomGenerator import ru.mipt.npm.muon.monitor.Model import ru.mipt.npm.muon.monitor.sim.Cos2TrackGenerator @@ -40,8 +38,6 @@ fun Application.module(context: Context = Global) { environment.log.info("Current directory: $currentDir") val solidManager = context.fetch(Solids) - install(DefaultHeaders) - install(CallLogging) install(ContentNegotiation) { json() } diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 61f4e033..076f9d37 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -32,7 +32,7 @@ kotlin { kotlinOptions { jvmTarget = "11" freeCompilerArgs = - freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + "-Xcontext-receivers" } } testRuns["test"].executionTask.configure { diff --git a/gradle.properties b/gradle.properties index 1d420172..f6fbbfc2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,6 @@ kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false org.gradle.parallel=true +org.gradle.jvmargs=-Xmx4G toolsVersion=0.11.4-kotlin-1.6.20 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e6e5897..aa991fce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index 07bd9b55..23b5071b 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -30,7 +30,7 @@ public external interface TabPaneProps : PropsWithChildren { public val TabPane: FC = fc("TabPane") { props -> var activeTab: String? by useState(props.activeTab) - val children: Array = Children.map(props.children) { + val children: Array?> = Children.map(props.children) { it.asElementOrNull() } ?: emptyArray() diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 86234c10..a89f2d07 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -2,9 +2,12 @@ plugins { id("ru.mipt.npm.gradle.jvm") } +val ktorVersion = npmlibs.versions.ktor.get() + dependencies { api(project(":visionforge-core")) - api("io.ktor-server-cio:${npmlibs.versions.ktor}") - api("io.ktor:ktor-server-html-builder:${npmlibs.versions.ktor}") - api("io.ktor:ktor-server-websockets:${npmlibs.versions.ktor}") + api("io.ktor:ktor-server-cio:${ktorVersion}") + api("io.ktor:ktor-server-html-builder:${ktorVersion}") + api("io.ktor:ktor-server-websockets:${ktorVersion}") + implementation("io.ktor:ktor-server-cors:${ktorVersion}") } \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 2abb6efb..7d55771c 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,24 +1,25 @@ package space.kscience.visionforge.server -import io.ktor.application.* -import io.ktor.features.CORS -import io.ktor.features.CallLogging -import io.ktor.html.respondHtml import io.ktor.http.* -import io.ktor.http.cio.websocket.Frame -import io.ktor.http.content.resources -import io.ktor.http.content.static -import io.ktor.response.respond -import io.ktor.response.respondText -import io.ktor.routing.* +import io.ktor.server.application.* import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.embeddedServer -import io.ktor.util.getOrFail -import io.ktor.websocket.WebSockets -import io.ktor.websocket.webSocket +import io.ktor.server.html.respondHtml +import io.ktor.server.http.content.resources +import io.ktor.server.http.content.static +import io.ktor.server.plugins.cors.CORS +import io.ktor.server.response.respond +import io.ktor.server.response.respondText +import io.ktor.server.routing.* +import io.ktor.server.util.getOrFail +import io.ktor.server.websocket.WebSockets +import io.ktor.server.websocket.webSocket +import io.ktor.websocket.Frame import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* @@ -130,13 +131,13 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(updateInterval.milliseconds).collect { update -> + vision.flowChanges(updateInterval.milliseconds).onEach { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update ) outgoing.send(Frame.Text(json)) - } + }.collect() } } catch (t: Throwable) { application.log.info("WebSocket update channel for $name is closed with exception: $t") @@ -241,21 +242,16 @@ public fun Application.visionServer( webServerUrl: Url, path: String = DEFAULT_PAGE, ): VisionServer { - if (featureOrNull(WebSockets) == null) { - install(WebSockets) + install(WebSockets) + install(CORS) { + anyHost() } - if (featureOrNull(CORS) == null) { - install(CORS) { - anyHost() - } - } +// if (pluginOrNull(CallLogging) == null) { +// install(CallLogging) +// } - if (featureOrNull(CallLogging) == null) { - install(CallLogging) - } - - val serverRoute = (featureOrNull(Routing) ?: install(Routing)).createRouteFromPath(path) + val serverRoute = install(Routing).createRouteFromPath(path) serverRoute { static { @@ -263,7 +259,7 @@ public fun Application.visionServer( } } - return VisionServer(visionManager, webServerUrl.copy(encodedPath = path), serverRoute) + return VisionServer(visionManager, URLBuilder(webServerUrl).apply { encodedPath = path }.build(), serverRoute) } /** diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 42525847..bc1fb271 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.tables -import kotlinext.js.jso +import kotlinx.js.jso import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.AbstractPlugin diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 02586120..38e3e6a6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -4,7 +4,6 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.TextBufferGeometry import info.laht.threekt.objects.Mesh -import kotlinext.js.jsObject import kotlinext.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn -- 2.34.1 From 212d729afbb3cd86fc9a3960cf7ad7bc46416b57 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 15 Apr 2022 12:46:05 +0300 Subject: [PATCH 072/143] A prototype for context receivers --- .../visionforge/html/HtmlVisionRenderer.kt | 2 +- .../visionforge/html/HtmlVisionContext.kt | 96 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index f5abdf42..5a4395af 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -22,7 +22,7 @@ internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" /** * Render a fragment in the given consumer and return a map of extracted visions - * @param manager a VisionManager used for serialization + * @param context a context used to create a vision fragment * @param embedData embed Vision initial state in the HTML * @param fetchDataUrl fetch data after first render from given url * @param fetchUpdatesUrl receive push updates from the server at given url diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt new file mode 100644 index 00000000..513676d4 --- /dev/null +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt @@ -0,0 +1,96 @@ +package space.kscience.visionforge.html + +import kotlinx.html.* +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MetaSerializer +import space.kscience.dataforge.meta.isEmpty +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.setAsRoot +import space.kscience.visionforge.visionManager + +/** + * Rendering context for visions in HTML + */ +public interface HtmlVisionContext : ContextAware { + + /** + * Generate div id for vision div tag + */ + public fun generateId(name: Name): String = "vision[$name]" + + /** + * Render vision at given [DIV] + */ + public fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) +} + + +public typealias HtmlVisionContextFragment = context(HtmlVisionContext) TagConsumer<*>.() -> Unit + +context(HtmlVisionContext) + public fun HtmlVisionContextFragment(content: TagConsumer<*>.() -> Unit): HtmlVisionFragment = content + +context(HtmlVisionContext) + private fun TagConsumer.vision( + visionManager: VisionManager, + name: Name, + vision: Vision, + outputMeta: Meta = Meta.EMPTY, +): T = div { + id = generateId(name) + classes = setOf(VisionTagConsumer.OUTPUT_CLASS) + vision.setAsRoot(visionManager) + attributes[VisionTagConsumer.OUTPUT_NAME_ATTRIBUTE] = name.toString() + if (!outputMeta.isEmpty()) { + //Hard-code output configuration + script { + attributes["class"] = VisionTagConsumer.OUTPUT_META_CLASS + unsafe { + +visionManager.jsonFormat.encodeToString(MetaSerializer, outputMeta) + } + } + } + renderVision(name, vision, outputMeta) +} + +context(HtmlVisionContext) + private fun TagConsumer.vision( + name: Name, + vision: Vision, + outputMeta: Meta = Meta.EMPTY, +): T = vision(context.visionManager, name, vision, outputMeta) + +/** + * Insert a vision in this HTML. + */ +context(HtmlVisionContext) + @DFExperimental + @VisionDSL + public fun TagConsumer.vision( + name: Name? = null, + visionProvider: VisionOutput.() -> Vision, +): T { + val output = VisionOutput(context, name) + val vision = output.visionProvider() + val actualName = + name ?: NameToken(VisionTagConsumer.DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() + return vision(output.buildVisionManager(), actualName, vision, output.meta) +} + +/** + * Insert a vision in this HTML. + */ +context(HtmlVisionContext) + @DFExperimental + @VisionDSL + public fun TagConsumer.vision( + name: String?, + visionProvider: VisionOutput.() -> Vision, +): T = vision(name?.parseAsName(), visionProvider) \ No newline at end of file -- 2.34.1 From ce02a18c09a8afadf2456f65deeef3e6773ade6a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 24 May 2022 23:00:10 +0300 Subject: [PATCH 073/143] Fix mesh conversion and lightning for examples --- demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt | 13 +++++++++++-- demo/playground/src/jvmMain/kotlin/randomSpheres.kt | 4 ++++ gradle.properties | 1 + visionforge-threejs/build.gradle.kts | 2 +- .../solid/three/ThreeCompositeFactory.kt | 4 ++-- .../visionforge/solid/three/ThreeMaterials.kt | 6 +----- .../space/kscience/visionforge/solid/three/three.kt | 12 +++++++++++- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt index 6ee718a2..24c56304 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt @@ -1,12 +1,21 @@ package space.kscience.visionforge.examples import space.kscience.gdml.GdmlShowCase -import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.Colors +import space.kscience.visionforge.gdml.gdml import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.solid fun main() = makeVisionFile { vision("canvas") { requirePlugin(Solids) - GdmlShowCase.babyIaxo().toVision() + solid { + ambientLight { + color(Colors.white) + } + gdml(GdmlShowCase.babyIaxo(), "D0") + } } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index 2d9a5f05..fd1b9865 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.examples import kotlinx.html.div import kotlinx.html.h1 +import space.kscience.visionforge.Colors import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.* import java.nio.file.Paths @@ -17,6 +18,9 @@ fun main() = makeVisionFile( div { vision { solid { + ambientLight { + color(Colors.white) + } repeat(100) { sphere(5, name = "sphere[$it]") { x = random.nextDouble(-300.0, 300.0) diff --git a/gradle.properties b/gradle.properties index f6fbbfc2..5a1cefb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false +#kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 3aa1ef5e..f0462837 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -11,5 +11,5 @@ kotlin{ dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.137.4")) - implementation(npm("three-csg-ts", "3.1.9")) + implementation(npm("three-csg-ts", "3.1.10")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index f57530b3..74528c50 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -38,8 +38,8 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class override fun invoke(three: ThreePlugin, obj: Composite): Mesh { - val first = three.buildObject3D(obj.first) as? Mesh ?: error("First part of composite is not a mesh") - val second = three.buildObject3D(obj.second) as? Mesh ?: error("Second part of composite is not a mesh") + val first = three.buildObject3D(obj.first).takeIfMesh() ?: error("First part of composite is not a mesh") + val second = three.buildObject3D(obj.second).takeIfMesh() ?: error("Second part of composite is not a mesh") return when (obj.compositeType) { CompositeType.GROUP, CompositeType.UNION -> CSG.union(first, second) CompositeType.INTERSECT -> CSG.intersect(first, second) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 5b4fa220..82b088e5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -161,17 +161,14 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { SolidMaterial.MATERIAL_COLOR_KEY -> { material.asDynamic().color = vision.computePropertyNode(SolidMaterial.MATERIAL_COLOR_KEY)?.threeColor() ?: ThreeMaterials.DEFAULT_COLOR - material.needsUpdate = true } SolidMaterial.SPECULAR_COLOR_KEY -> { material.asDynamic().specular = vision.computePropertyNode(SolidMaterial.SPECULAR_COLOR_KEY)?.threeColor() ?: ThreeMaterials.DEFAULT_COLOR - material.needsUpdate = true } SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { material.asDynamic().emissive = vision.computePropertyNode(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY)?.threeColor() ?: ThreeMaterials.BLACK_COLOR - material.needsUpdate = true } SolidMaterial.MATERIAL_OPACITY_KEY -> { val opacity = vision.getPropertyValue( @@ -180,16 +177,15 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { )?.double ?: 1.0 material.opacity = opacity material.transparent = opacity < 1.0 - material.needsUpdate = true } SolidMaterial.MATERIAL_WIREFRAME_KEY -> { material.asDynamic().wireframe = vision.getPropertyValue( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, )?.boolean ?: false - material.needsUpdate = true } else -> console.warn("Unrecognized material property: $propertyName") } + material.needsUpdate = true } } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index 447cf4b6..d21ff544 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Layers +import info.laht.threekt.core.Object3D import info.laht.threekt.external.controls.OrbitControls import info.laht.threekt.materials.Material import info.laht.threekt.math.Vector3 @@ -31,4 +32,13 @@ internal fun Any.dispose() { } } -public fun Layers.check(layer: Int): Boolean = (mask shr(layer) and 0x00000001) > 0 \ No newline at end of file +public fun Layers.check(layer: Int): Boolean = (mask shr (layer) and 0x00000001) > 0 + +internal fun Object3D.takeIfMesh(): Mesh? { + val d = asDynamic() + return if(d.isMesh as Boolean){ + d.unsafeCast() + } else { + null + } +} \ No newline at end of file -- 2.34.1 From 86935ce52af027c72bcf75c2b8a6e20c5f153156 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 24 May 2022 23:09:40 +0300 Subject: [PATCH 074/143] Fix light in GDML demo --- .../kscience/visionforge/gdml/demo/GDMLAppComponent.kt | 6 ++++++ .../kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 823297ec..c82fa60b 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -17,6 +17,7 @@ import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.Name import space.kscience.gdml.Gdml import space.kscience.gdml.decodeFromString +import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.markLayers import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.ring.ThreeCanvasWithControls @@ -24,6 +25,8 @@ import space.kscience.visionforge.ring.tab import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.invoke import styled.css import styled.styledDiv @@ -53,6 +56,9 @@ val GDMLApp = fc("GDMLApp") { props -> setAsRoot(visionManager) console.info("Marking layers for file $name") markLayers() + ambientLight { + color(Colors.white) + } } } name.endsWith(".json") -> visionManager.decodeFromString(data) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 74246432..284e09f6 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -6,7 +6,10 @@ import react.dom.render import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application +import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication import styled.injectGlobal @@ -41,7 +44,11 @@ private class GDMLDemoApp : Application { render(element) { child(GDMLApp) { - val vision = GdmlShowCase.cubes().toVision() + val vision = GdmlShowCase.cubes().toVision().apply { + ambientLight { + color(Colors.white) + } + } //println(context.plugins.fetch(VisionManager).encodeToString(vision)) attrs { this.context = context -- 2.34.1 From 4b1149b99ba35efc2672d89a8879824bb92c4d3a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 6 Jul 2022 11:11:48 +0300 Subject: [PATCH 075/143] Migrate to new build tools and DF 0.6 --- build.gradle.kts | 10 ++++++++-- .../kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt | 5 +++-- .../js-playground/src/main/kotlin/JsPlaygroundApp.kt | 5 +++-- .../kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt | 5 +++-- gradle.properties | 2 +- ui/react/build.gradle.kts | 4 ++++ .../kscience/visionforge/react/PropertyEditor.kt | 4 ++-- .../kotlin/space/kscience/visionforge/react/ext.kt | 10 ++++++++++ .../ThreeWithControlsPlugin.kt | 8 +++++--- .../ringPropertyEditor.kt | 5 +++-- .../space/kscience/visionforge/VisionManager.kt | 2 +- .../space/kscience/visionforge/VisionClient.kt | 3 +-- .../kotlin/space/kscience/visionforge/FXPlugin.kt | 5 +++-- .../space/kscience/visionforge/solid/FX3DPlugin.kt | 3 ++- .../kscience/visionforge/markup/MarkupPlugin.kt | 4 +++- .../space/kscience/visionforge/plotly/plotlyJs.kt | 4 +++- .../space/kscience/visionforge/plotly/plotlyJvm.kt | 5 +++-- .../space/kscience/visionforge/solid/Solids.kt | 3 ++- visionforge-tables/build.gradle.kts | 2 +- .../kscience/visionforge/tables/TableVisionPlugin.kt | 4 ++-- .../kscience/visionforge/tables/VisionOfTable.kt | 6 +++--- .../kscience/visionforge/tables/VisionOfTableTest.kt | 4 ++-- .../visionforge/tables/TableVisionJsPlugin.kt | 12 ++++++------ .../visionforge/solid/three/ThreeLabelFactory.kt | 2 +- .../kscience/visionforge/solid/three/ThreePlugin.kt | 3 ++- 25 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 ui/react/src/main/kotlin/space/kscience/visionforge/react/ext.kt diff --git a/build.gradle.kts b/build.gradle.kts index 3d983923..5e8bc323 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,12 +3,12 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.5.2") +val dataforgeVersion by extra("0.6.0-dev-10") val fxVersion by extra("11") allprojects{ group = "space.kscience" - version = "0.3.0-dev-1" + version = "0.3.0-dev-2" } subprojects { @@ -19,6 +19,12 @@ subprojects { mavenCentral() maven("https://maven.jzy3d.org/releases") } + + tasks.withType{ + kotlinOptions{ + freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" + } + } } ksciencePublish { diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 284e09f6..edcbe6f0 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -2,12 +2,13 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.document import kotlinx.css.* -import react.dom.render +import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin @@ -42,7 +43,7 @@ private class GDMLDemoApp : Application { val element = document.getElementById("application") ?: error("Element with id 'application' not found on page") - render(element) { + createRoot(element).render { child(GDMLApp) { val vision = GdmlShowCase.cubes().toVision().apply { ambientLight { diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 5e09911b..1cd2611b 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,6 +1,6 @@ import kotlinx.browser.document import kotlinx.css.* -import react.dom.render +import react.dom.client.createRoot import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context @@ -10,6 +10,7 @@ import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionClient import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.react.render import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.ring.solid @@ -38,7 +39,7 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") - render(element) { + createRoot(element).render { styledDiv { css { padding(0.pt) diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 6b611146..17c3f149 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,11 +1,12 @@ package ru.mipt.npm.muon.monitor import kotlinx.browser.document -import react.dom.render +import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -21,7 +22,7 @@ private class MMDemoApp : Application { val model = Model(visionManager) val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") - render(element) { + createRoot(element).render { child(MMApp) { attrs { this.model = model diff --git a/gradle.properties b/gradle.properties index 5a1cefb4..95d6d923 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.jupyter.add.scanner=false org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.11.4-kotlin-1.6.20 \ No newline at end of file +toolsVersion=0.11.7-kotlin-1.7.0 \ No newline at end of file diff --git a/ui/react/build.gradle.kts b/ui/react/build.gradle.kts index 40853ca9..d71dc6ac 100644 --- a/ui/react/build.gradle.kts +++ b/ui/react/build.gradle.kts @@ -8,4 +8,8 @@ dependencies{ api("org.jetbrains.kotlin-wrappers:kotlin-react-dom") // implementation(npm("react-select","4.3.0")) implementation(project(":visionforge-threejs")) +} + +rootProject.extensions.configure { + versions.webpackCli.version = "4.10.0" } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 6c677e2e..29c9b49e 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -7,7 +7,7 @@ import org.w3c.dom.Element import org.w3c.dom.events.Event import react.* import react.dom.attrs -import react.dom.render +import react.dom.client.createRoot import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.ValueRequirement @@ -235,6 +235,6 @@ public fun Element.configEditor( default: Meta = config, descriptor: MetaDescriptor? = null, key: Any? = null, -): Unit = render(this) { +): Unit = createRoot(this).render { configEditor(config, default, descriptor, key = key) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ext.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ext.kt new file mode 100644 index 00000000..ae47fa65 --- /dev/null +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ext.kt @@ -0,0 +1,10 @@ +package space.kscience.visionforge.react + +import react.Props +import react.RBuilder +import react.createElement +import react.dom.client.Root + +public fun Root.render(block: RBuilder.() -> Unit) { + render(createElement(block)) +} \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index c01b5ae1..bf1a2160 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.ring import kotlinx.coroutines.async import org.w3c.dom.Element -import react.child +import react.dom.client.createRoot import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory @@ -12,6 +12,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision +import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.three.ThreePlugin import kotlin.reflect.KClass @@ -25,7 +26,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING override fun render(element: Element, vision: Vision, meta: Meta) { - react.dom.render(element) { + createRoot(element).render { child(ThreeCanvasWithControls) { attrs { this.context = this@ThreeWithControlsPlugin.context @@ -45,6 +46,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.threejs.withControls", PluginTag.DATAFORGE_GROUP) override val type: KClass = ThreeWithControlsPlugin::class - override fun invoke(meta: Meta, context: Context): ThreeWithControlsPlugin = ThreeWithControlsPlugin() + + override fun build(context: Context, meta: Meta): ThreeWithControlsPlugin = ThreeWithControlsPlugin() } } \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt index 06f2a1c0..5c959184 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.ring import org.w3c.dom.Element import react.RBuilder +import react.dom.client.createRoot import react.dom.p -import react.dom.render import ringui.Island import ringui.SmartTabs import ringui.Tab @@ -14,6 +14,7 @@ import space.kscience.visionforge.getStyle import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor +import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.styles @@ -72,6 +73,6 @@ public fun RBuilder.ringPropertyEditor( public fun Element.ringPropertyEditor( item: Vision, descriptor: MetaDescriptor? = item.descriptor, -): Unit = render(this) { +): Unit = createRoot(this).render { ringPropertyEditor(item, descriptor = descriptor) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 118fd47c..cd017cad 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -63,7 +63,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { public const val VISION_SERIALIZER_MODULE_TARGET: String = "visionSerializerModule" - override fun invoke(meta: Meta, context: Context): VisionManager = VisionManager(meta) + override fun build(context: Context, meta: Meta): VisionManager = VisionManager(meta) private val defaultSerialModule: SerializersModule = SerializersModule { polymorphic(Vision::class) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index c437a5d6..e9425afb 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -203,8 +203,7 @@ public class VisionClient : AbstractPlugin() { ) else super.content(target) public companion object : PluginFactory { - - override fun invoke(meta: Meta, context: Context): VisionClient = VisionClient() + override fun build(context: Context, meta: Meta): VisionClient = VisionClient() override val tag: PluginTag = PluginTag(name = "vision.client", group = PluginTag.DATAFORGE_GROUP) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt index c571059c..4edc4f13 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt @@ -95,8 +95,9 @@ public class FXPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(meta) { public companion object : PluginFactory { override val type: KClass = FXPlugin::class override val tag: PluginTag = PluginTag("vis.fx", group = PluginTag.DATAFORGE_GROUP) - override fun invoke(meta: Meta, context: Context): FXPlugin = - FXPlugin(meta) + + override fun build(context: Context, meta: Meta): FXPlugin = FXPlugin(meta) + } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 48f99ac1..e16b2126 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -138,7 +138,8 @@ public class FX3DPlugin : AbstractPlugin() { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.fx3D", PluginTag.DATAFORGE_GROUP) override val type: KClass = FX3DPlugin::class - override fun invoke(meta: Meta, context: Context): FX3DPlugin = FX3DPlugin() + + override fun build(context: Context, meta: Meta): FX3DPlugin = FX3DPlugin() } } diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 4d7a1060..939669a0 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -47,6 +47,8 @@ public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) override val type: KClass = MarkupPlugin::class - override fun invoke(meta: Meta, context: Context): MarkupPlugin = MarkupPlugin() + + override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() + } } \ No newline at end of file diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 7406986b..d3b8473e 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -42,6 +42,8 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly.js", PluginTag.DATAFORGE_GROUP) override val type: KClass = PlotlyPlugin::class - override fun invoke(meta: Meta, context: Context): PlotlyPlugin = PlotlyPlugin() + + override fun build(context: Context, meta: Meta): PlotlyPlugin = PlotlyPlugin() + } } \ No newline at end of file diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt index ad7be4f3..8fda1d98 100644 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt +++ b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.modules.SerializersModule import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.Plugin import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta @@ -18,6 +17,8 @@ public actual class PlotlyPlugin : VisionPlugin() { public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) override val type: KClass = PlotlyPlugin::class - override fun invoke(meta: Meta, context: Context): PlotlyPlugin = PlotlyPlugin() + + override fun build(context: Context, meta: Meta): PlotlyPlugin = PlotlyPlugin() + } } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 7e52d709..b43d6475 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -24,7 +24,8 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { public companion object : PluginFactory { override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) override val type: KClass = Solids::class - override fun invoke(meta: Meta, context: Context): Solids = Solids(meta) + + override fun build(context: Context, meta: Meta): Solids = Solids(meta) private fun PolymorphicModuleBuilder.solids() { subclass(SolidGroup.serializer()) diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 55c367c5..4326da36 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.mpp") } -val tablesVersion = "0.1.4" +val tablesVersion = "0.2.0-dev-1" kscience { useSerialization() diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt index 6e632147..fd03b550 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt @@ -8,7 +8,6 @@ import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionManager import space.kscience.visionforge.VisionPlugin import kotlin.reflect.KClass @@ -25,6 +24,7 @@ public class TableVisionPlugin : VisionPlugin() { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.table", PluginTag.DATAFORGE_GROUP) override val type: KClass = TableVisionPlugin::class - override fun invoke(meta: Meta, context: Context): TableVisionPlugin = TableVisionPlugin() + + override fun build(context: Context, meta: Meta): TableVisionPlugin = TableVisionPlugin() } } \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index 95888f67..6370b699 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -86,7 +86,7 @@ public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.Na @DFExperimental public inline fun VisionOutput.table( vararg headers: ColumnHeader, - block: MutableRowTable.() -> Unit, + block: RowTableBuilder.() -> Unit, ): VisionOfTable { requirePlugin(TableVisionPlugin) return RowTable(*headers, block = block).toVision() @@ -94,8 +94,8 @@ public inline fun VisionOutput.table( @DFExperimental public inline fun VisionOutput.columnTable( - columnSize: UInt, - block: MutableColumnTable.() -> Unit, + columnSize: Int, + block: ColumnTableBuilder.() -> Unit, ): VisionOfTable = ColumnTable(columnSize, block).toVision() @DFExperimental diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt index 5796d8e2..8c9f755c 100644 --- a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -17,7 +17,7 @@ internal class VisionOfTableTest { val x by ColumnHeader.typed() val y by ColumnHeader.typed() - val table = ColumnTable(100U) { + val table = ColumnTable(100) { x.fill { it.asValue() } y.values = x.values.map { it?.double?.pow(2)?.asValue() } } @@ -27,6 +27,6 @@ internal class VisionOfTableTest { val rows = vision.rowSequence().toList() - assertEquals(50, rows[50][x]?.int) + assertEquals(50, rows[50][x].int) } } \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index bc1fb271..28ad7327 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag -import space.kscience.dataforge.meta.DynamicMeta import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.toDynamic import space.kscience.dataforge.names.Name @@ -49,15 +48,15 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { } }.toTypedArray() - columns = Array(table.headers.size + 1){ - if(it==0){ + columns = Array(table.headers.size + 1) { + if (it == 0) { jso { field = "@index" title = "#" resizable = false } } else { - val header = table.headers[it-1] + val header = table.headers[it - 1] jso { field = header.name title = header.properties.title ?: header.name @@ -67,7 +66,7 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { } - data = table.rows.mapIndexed { index, row-> + data = table.rows.mapIndexed { index, row -> val d = row.meta.toDynamic() d["@index"] = index d @@ -91,6 +90,7 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.table.js", PluginTag.DATAFORGE_GROUP) override val type: KClass = TableVisionJsPlugin::class - override fun invoke(meta: Meta, context: Context): TableVisionJsPlugin = TableVisionJsPlugin() + + override fun build(context: Context, meta: Meta): TableVisionJsPlugin = TableVisionJsPlugin() } } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 38e3e6a6..d07f542e 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -4,7 +4,7 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.TextBufferGeometry import info.laht.threekt.objects.Mesh -import kotlinext.js.jso +import kotlinx.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 8c32551a..182ec009 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -151,7 +151,8 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.threejs", PluginTag.DATAFORGE_GROUP) override val type: KClass = ThreePlugin::class - override fun invoke(meta: Meta, context: Context): ThreePlugin = ThreePlugin() + + override fun build(context: Context, meta: Meta): ThreePlugin = ThreePlugin() } } -- 2.34.1 From 791d6d7a815376b7af2550a7101a6e38c7191ed0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 4 Aug 2022 21:36:00 +0300 Subject: [PATCH 076/143] [WIP] great refactoring in progress --- build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 37 +- .../npm/root/serialization/rootToSolid.kt | 2 +- .../visionforge/gdml/GDMLVisionTest.kt | 14 +- .../visionforge/gdml/demo/GDMLAppComponent.kt | 1 - .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 1 - .../src/main/kotlin/JsPlaygroundApp.kt | 4 +- .../src/main/kotlin/gravityDemo.kt | 4 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 20 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 1 - .../src/jvmMain/kotlin/gdmlCurve.kt | 4 +- .../playground/src/jvmMain/kotlin/gdmlIaxo.kt | 4 +- .../src/jvmMain/kotlin/randomSpheres.kt | 4 +- .../src/jvmMain/kotlin/simpleCube.kt | 4 +- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 2 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 2 +- .../kscience/visionforge/solid/demo/demo.kt | 30 +- .../visionforge/solid/demo/VariableBox.kt | 3 +- docs/hierarchy.md | 2 +- docs/inheritance.md | 2 +- docs/uml/Vision.puml | 6 +- gradle.properties | 2 +- .../visionforge/bootstrap/threeControls.kt | 4 +- .../bootstrap/visionPropertyEditor.kt | 5 +- .../kscience/visionforge/react/VisionTree.kt | 10 +- .../ThreeViewWithControls.kt | 4 +- visionforge-core/api/visionforge-core.api | 16 +- .../kscience/visionforge/AbstractVision.kt | 107 ++++++ .../visionforge/ComputedVisionProperties.kt | 84 ----- .../kscience/visionforge/StyleReference.kt | 6 +- .../space/kscience/visionforge/StyleSheet.kt | 36 +- .../space/kscience/visionforge/Vision.kt | 201 +++++++---- .../space/kscience/visionforge/VisionBase.kt | 176 ---------- .../kscience/visionforge/VisionChange.kt | 38 +- .../kscience/visionforge/VisionContainer.kt | 196 +++++++++++ .../space/kscience/visionforge/VisionGroup.kt | 176 +++++----- .../kscience/visionforge/VisionGroupBase.kt | 168 --------- .../kscience/visionforge/VisionManager.kt | 26 +- .../kscience/visionforge/VisionProperties.kt | 81 +++++ .../visionforge/VisionPropertyContainer.kt | 35 +- .../visionforge/html/VisionOfHtmlForm.kt | 3 +- .../visionforge/html/VisionOfHtmlInput.kt | 15 +- .../kscience/visionforge/visionDelegates.kt | 4 +- .../kscience/visionforge/visionDescriptor.kt | 1 + .../visionforge/visitor/StatisticsVisitor.kt | 2 - .../visionforge/visitor/VisionVisitor.kt | 18 +- .../kscience/visionforge/html/HtmlTagTest.kt | 16 +- .../visionforge/meta/VisionPropertyTest.kt | 36 +- .../editor/VisionEditorFragment.kt | 9 +- .../visionforge/editor/VisionTreeFragment.kt | 8 +- .../kscience/visionforge/solid/FX3DPlugin.kt | 8 +- .../visionforge/solid/FXReferenceFactory.kt | 11 +- .../solid/VisualObjectFXBinding.kt | 4 +- .../visionforge/gdml/GdmlLoaderOptions.kt | 4 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 16 +- .../kscience/visionforge/gdml/markLayers.kt | 17 +- .../src/commonTest/kotlin/TestCubes.kt | 6 +- .../visionforge/markup/VisionOfMarkup.kt | 7 +- .../visionforge/plotly/VisionOfPlotly.kt | 11 +- .../visionforge/server/VisionServer.kt | 3 +- visionforge-solid/api/visionforge-solid.api | 4 +- .../visionforge/solid/ColorAccessor.kt | 13 +- .../kscience/visionforge/solid/Composite.kt | 31 +- .../kscience/visionforge/solid/Extruded.kt | 12 +- .../kscience/visionforge/solid/Quaternion.kt | 11 - .../space/kscience/visionforge/solid/Solid.kt | 34 +- .../kscience/visionforge/solid/SolidBase.kt | 17 +- .../kscience/visionforge/solid/SolidGroup.kt | 43 ++- .../visionforge/solid/SolidMaterial.kt | 11 +- .../visionforge/solid/SolidReference.kt | 328 +++++++++++------- .../kscience/visionforge/solid/Solids.kt | 5 +- .../kscience/visionforge/solid/Sphere.kt | 10 +- .../kscience/visionforge/solid/SphereLayer.kt | 18 +- .../kscience/visionforge/solid/geometry.kt | 6 +- .../solid/specifications/Canvas3DOptions.kt | 1 + .../solid/transform/RemoveSingleChild.kt | 45 ++- .../visionforge/solid/transform/UnRef.kt | 36 +- .../visionforge/solid/CompositeTest.kt | 2 +- .../kscience/visionforge/solid/ConvexTest.kt | 5 +- .../kscience/visionforge/solid/GroupTest.kt | 14 +- .../visionforge/solid/PropertyTest.kt | 20 +- .../visionforge/solid/SerializationTest.kt | 17 +- .../visionforge/solid/SolidPluginTest.kt | 5 +- .../visionforge/solid/SolidReferenceTest.kt | 6 +- .../visionforge/solid/VisionUpdateTest.kt | 12 +- .../visionforge/tables/VisionOfTable.kt | 8 +- .../solid/three/MeshThreeFactory.kt | 17 +- .../solid/three/ThreeAmbientLightFactory.kt | 2 +- .../solid/three/ThreeCanvasLabelFactory.kt | 5 +- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../visionforge/solid/three/ThreeFactory.kt | 2 +- .../solid/three/ThreeLabelFactory.kt | 2 +- .../solid/three/ThreeLineFactory.kt | 6 +- .../visionforge/solid/three/ThreeMaterials.kt | 4 +- .../visionforge/solid/three/ThreePlugin.kt | 11 +- .../solid/three/ThreePointLightFactory.kt | 9 +- .../solid/three/ThreeReferenceFactory.kt | 4 +- 97 files changed, 1316 insertions(+), 1181 deletions(-) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt delete mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt diff --git a/build.gradle.kts b/build.gradle.kts index 5e8bc323..f0c9d504 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.6.0-dev-10") +val dataforgeVersion by extra("0.6.0-dev-12") val fxVersion by extra("11") allprojects{ diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 7c345dd4..fbeb84dd 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,10 +1,14 @@ package ru.mipt.npm.root -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.doubleArray import space.kscience.visionforge.isEmpty +import space.kscience.visionforge.setPropertyValue import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* @@ -20,7 +24,7 @@ private fun degToRad(d: Double) = d * PI / 180.0 private data class RootToSolidContext( val prototypeHolder: PrototypeHolder, val currentLayer: Int = 0, - val maxLayer: Int = 5 + val maxLayer: Int = 5, ) // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix @@ -42,14 +46,17 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { "TGeoIdentity" -> { //do nothing } + "TGeoTranslation" -> { val fTranslation by matrix.meta.doubleArray() translate(fTranslation) } + "TGeoRotation" -> { val fRotationMatrix by matrix.meta.doubleArray() rotate(fRotationMatrix) } + "TGeoCombiTrans" -> { val fTranslation by matrix.meta.doubleArray() @@ -58,6 +65,7 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { rotate(it.doubleArray) } } + "TGeoHMatrix" -> { val fTranslation by matrix.meta.doubleArray() val fRotationMatrix by matrix.meta.doubleArray() @@ -73,7 +81,7 @@ private fun SolidGroup.addShape( shape: DGeoShape, context: RootToSolidContext, name: String? = shape.fName.ifEmpty { null }, - block: Solid.() -> Unit = {} + block: Solid.() -> Unit = {}, ) { when (shape.typename) { "TGeoCompositeShape" -> { @@ -94,6 +102,7 @@ private fun SolidGroup.addShape( } }.apply(block) } + "TGeoXtru" -> { val fNvert by shape.meta.int(0) val fX by shape.meta.doubleArray() @@ -121,6 +130,7 @@ private fun SolidGroup.addShape( } }.apply(block) } + "TGeoTube" -> { val fRmax by shape.meta.double(0.0) val fDz by shape.meta.double(0.0) @@ -134,6 +144,7 @@ private fun SolidGroup.addShape( block = block ) } + "TGeoTubeSeg" -> { val fRmax by shape.meta.double(0.0) val fDz by shape.meta.double(0.0) @@ -151,6 +162,7 @@ private fun SolidGroup.addShape( block = block ) } + "TGeoPcon" -> { val fDphi by shape.meta.double(0.0) val fNz by shape.meta.int(2) @@ -176,6 +188,7 @@ private fun SolidGroup.addShape( TODO() } } + "TGeoPgon" -> { //TODO add a inner polygone layer val fDphi by shape.meta.double(0.0) @@ -206,15 +219,18 @@ private fun SolidGroup.addShape( } }.apply(block) } + "TGeoShapeAssembly" -> { val fVolume by shape.dObject(::DGeoVolume) fVolume?.let { volume -> addRootVolume(volume, context, block = block) } } + "TGeoBBox" -> { box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name, block = block) } + "TGeoTrap" -> { val fTheta by shape.meta.double(0.0) val fPhi by shape.meta.double(0.0) @@ -242,6 +258,7 @@ private fun SolidGroup.addShape( val node8 = Point3D(-fTl2, fH2, fDz) hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) } + "TGeoScaledShape" -> { val fShape by shape.dObject(::DGeoShape) val fScale by shape.dObject(::DGeoScale) @@ -253,6 +270,7 @@ private fun SolidGroup.addShape( } } } + else -> { TODO("A shape with type ${shape.typename} not implemented") } @@ -267,6 +285,7 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { val fMatrix by obj.dObject(::DGeoMatrix) this.useMatrix(fMatrix) } + "TGeoNodeOffset" -> { val fOffset by obj.meta.double(0.0) x = fOffset @@ -301,10 +320,10 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? } } } - return if (group.isEmpty()) { + return if (group.children.isEmpty()) { null - } else if (group.children.size == 1 && group.meta.isEmpty()) { - (group.children.values.first() as Solid).apply { parent = null } + } else if (group.items.size == 1 && group.meta.isEmpty()) { + group.items.values.first().apply { parent = null } } else { group } @@ -317,7 +336,7 @@ private fun SolidGroup.addRootVolume( context: RootToSolidContext, name: String? = null, cache: Boolean = true, - block: Solid.() -> Unit = {} + block: Solid.() -> Unit = {}, ) { val combinedName = if (volume.fName.isEmpty()) { name @@ -330,7 +349,7 @@ private fun SolidGroup.addRootVolume( if (!cache) { val group = buildVolume(volume, context)?.apply { volume.fFillColor?.let { - meta[MATERIAL_COLOR_KEY] = RootColors[it] + setPropertyValue(MATERIAL_COLOR_KEY, RootColors[it]) } block() } @@ -347,7 +366,7 @@ private fun SolidGroup.addRootVolume( ref(templateName, name).apply { volume.fFillColor?.let { - meta[MATERIAL_COLOR_KEY] = RootColors[it] + setPropertyValue(MATERIAL_COLOR_KEY, RootColors[it]) } block() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt index 117e51b3..4483afcb 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt @@ -160,7 +160,7 @@ private fun SolidGroup.volume(volume: TGeoVolume, name: String? = null, cache: B name = combinedName, obj = group, prototypeHolder = rootPrototypes, - templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") + prototypeName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") ) } diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 12918532..afb23f16 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -1,13 +1,13 @@ package space.kscience.visionforge.gdml +import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.string import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Vision -import space.kscience.visionforge.computeProperties import space.kscience.visionforge.get -import space.kscience.visionforge.setProperty +import space.kscience.visionforge.getProperty +import space.kscience.visionforge.getPropertyValue import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.material @@ -20,8 +20,8 @@ class GDMLVisionTest { @Test fun testCubesStyles(){ - val segment = cubes["composite-000.segment-0"] as Solid - println(segment.computeProperties().getValue(Vision.STYLE_KEY)) + val segment = cubes.children["composite-000.segment-0"] as Solid + println(segment.getPropertyValue(Vision.STYLE_KEY)) // println(segment.computePropertyNode(SolidMaterial.MATERIAL_KEY)) // println(segment.computeProperty(SolidMaterial.MATERIAL_COLOR_KEY)) @@ -35,7 +35,7 @@ class GDMLVisionTest { fun testPrototypeProperty() { val child = cubes[Name.of("composite-000","segment-0")] assertNotNull(child) - child.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) - assertEquals("red", child.getPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY)?.string) + child.setPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) + assertEquals("red", child.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).string) } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index c82fa60b..b28dec12 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -26,7 +26,6 @@ import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.invoke import styled.css import styled.styledDiv diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index edcbe6f0..1cd1b0ff 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -10,7 +10,6 @@ import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication import styled.injectGlobal diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 1cd2611b..c31b48e0 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -75,7 +75,7 @@ private class JsPlaygroundApp : Application { context = playgroundContext solid { ambientLight { - color(Colors.white) + color.set(Colors.white) } repeat(100) { sphere(5, name = "sphere[$it]") { @@ -83,7 +83,7 @@ private class JsPlaygroundApp : Application { y = random.nextDouble(-300.0, 300.0) z = random.nextDouble(-300.0, 300.0) material { - color(random.nextInt()) + color.set(random.nextInt()) } detail = 16 } diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index 4d420cc7..3bdd574c 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -43,13 +43,13 @@ val GravityDemo = fc { props -> context = props.context solid { pointLight(200, 200, 200, name = "light"){ - color(Colors.white) + color.set(Colors.white) } ambientLight() sphere(5.0, "ball") { detail = 16 - color("red") + color.set("red") val h = 100.0 y = h context.launch { diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 06501374..596b11dd 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -3,24 +3,18 @@ package ru.mipt.npm.muon.monitor import ru.mipt.npm.muon.monitor.Monitor.CENTRAL_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.LOWER_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.UPPER_LAYER_Z +import space.kscience.visionforge.VisionContainerBuilder import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.removeAll import space.kscience.visionforge.setAsRoot -import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.* -import kotlin.collections.HashMap -import kotlin.collections.HashSet -import kotlin.collections.filter -import kotlin.collections.forEach import kotlin.collections.set -import kotlin.collections.toTypedArray import kotlin.math.PI class Model(val manager: VisionManager) { private val map = HashMap() private val events = HashSet() - private fun SolidGroup.pixel(pixel: SC1) { + private fun VisionContainerBuilder.pixel(pixel: SC1) { val group = group(pixel.name) { position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z) box(pixel.xSize, pixel.ySize, pixel.zSize) @@ -45,7 +39,7 @@ class Model(val manager: VisionManager) { val root: SolidGroup = SolidGroup().apply { setAsRoot(this@Model.manager) material { - color("darkgreen") + color.set("darkgreen") } rotationX = PI / 2 group("bottom") { @@ -70,14 +64,14 @@ class Model(val manager: VisionManager) { private fun highlight(pixel: String) { println("highlight $pixel") - map[pixel]?.color?.invoke("blue") + map[pixel]?.color.set("blue") } fun reset() { map.values.forEach { - it.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, null) + it.setPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY, null) } - tracks.removeAll() + tracks.children.clear() } fun displayEvent(event: Event) { @@ -89,7 +83,7 @@ class Model(val manager: VisionManager) { event.track?.let { tracks.polyline(*it.toTypedArray(), name = "track[${event.id}]") { thickness = 4 - color("red") + color.set("red") } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index f9c03756..77ad5845 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -25,7 +25,6 @@ import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.edges import styled.css diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 70827a2d..f98a0b81 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.color -import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.set import space.kscience.visionforge.visible import java.nio.file.Path @@ -229,7 +229,7 @@ fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceL visible = false } if(solid.name.startsWith("gas")){ - color("green") + color.set("green") } else { //make all solids semi-transparent transparent() diff --git a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt index 24c56304..ee47c461 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt @@ -5,7 +5,7 @@ import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.gdml import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.solid fun main() = makeVisionFile { @@ -13,7 +13,7 @@ fun main() = makeVisionFile { requirePlugin(Solids) solid { ambientLight { - color(Colors.white) + color.set(Colors.white) } gdml(GdmlShowCase.babyIaxo(), "D0") } diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index fd1b9865..47201ff8 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -19,7 +19,7 @@ fun main() = makeVisionFile( vision { solid { ambientLight { - color(Colors.white) + color.set(Colors.white) } repeat(100) { sphere(5, name = "sphere[$it]") { @@ -27,7 +27,7 @@ fun main() = makeVisionFile( y = random.nextDouble(-300.0, 300.0) z = random.nextDouble(-300.0, 300.0) material { - color(random.nextInt()) + color.set(random.nextInt()) } detail = 16 } diff --git a/demo/playground/src/jvmMain/kotlin/simpleCube.kt b/demo/playground/src/jvmMain/kotlin/simpleCube.kt index e1fc91eb..5dae515c 100644 --- a/demo/playground/src/jvmMain/kotlin/simpleCube.kt +++ b/demo/playground/src/jvmMain/kotlin/simpleCube.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.examples import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.box -import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.material +import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.solid fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { @@ -11,7 +11,7 @@ fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { solid { box(100, 100, 100) material { - emissiveColor("red") + emissiveColor.set("red") } } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index 93650fb2..631d70f8 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -15,7 +15,7 @@ internal fun visionOfSatellite( ySegmentSize: Number = xSegmentSize, fiberDiameter: Number = 1.0, ): SolidGroup = SolidGroup { - color("darkgreen") + color.set("darkgreen") val transparent by style { this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3 } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index fbacc5b1..d601a74b 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -44,7 +44,7 @@ fun main() { val randomJ = Random.nextInt(1, 4) val target = Name.parse("layer[$randomLayer].segment[$randomI,$randomJ]") val targetVision = sat[target] as Solid - targetVision.color("red") + targetVision.color.set("red") delay(1000) targetVision.color.clear() delay(500) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 5631de56..228f63f7 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -20,7 +20,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro } val vision = SolidGroup(block).apply { ambientLight{ - color(Colors.white) + color.set(Colors.white) } } render(Name.parse(name), vision, meta) @@ -46,23 +46,23 @@ fun VisionLayout.showcase() { ambientLight() box(100.0, 100.0, 100.0) { z = -110.0 - color("teal") + color.set("teal") } sphere(50.0) { x = 110 detail = 16 - color("red") + color.set("red") } tube(50, height = 10, innerRadius = 25, angle = PI) { y = 110 detail = 16 rotationX = PI / 4 - color("blue") + color.set("blue") } sphereLayer(50, 40, theta = PI / 2) { rotationX = -PI * 3 / 4 z = 110 - color(Colors.pink) + color.set(Colors.pink) } } @@ -77,7 +77,7 @@ fun VisionLayout.showcase() { visible = false x = 110.0 //override color for this cube - color(1530) + color.set(1530) GlobalScope.launch(Dispatchers.Main) { while (isActive) { @@ -92,7 +92,7 @@ fun VisionLayout.showcase() { val random = Random(111) while (isActive) { delay(1000) - group.color(random.nextInt(0, Int.MAX_VALUE)) + group.color.set(random.nextInt(0, Int.MAX_VALUE)) } } } @@ -104,7 +104,7 @@ fun VisionLayout.showcase() { rotationY = PI / 4 box(100, 100, 100) { rotationZ = PI / 4 - color(Colors.red) + color.set(Colors.red) } } } @@ -117,7 +117,7 @@ fun VisionLayout.showcase() { for (i in 0..100) { layer(i * 5, 20 * sin(2 * PI / 100 * i), 20 * cos(2 * PI / 100 * i)) } - color(Colors.teal) + color.set(Colors.teal) rotationX = -PI / 2 } } @@ -126,13 +126,13 @@ fun VisionLayout.showcase() { sphere(100) { detail = 32 opacity = 0.4 - color(Colors.blue) + color.set(Colors.blue) } repeat(20) { polyline(Point3D(100, 100, 100), Point3D(-100, -100, -100)) { thickness = 3.0 rotationX = it * PI2 / 20 - color(Colors.green) + color.set(Colors.green) //rotationY = it * PI2 / 20 } } @@ -159,7 +159,7 @@ fun VisionLayout.showcaseCSG() { detail = 32 } material { - color(Colors.pink) + color.set(Colors.pink) } } composite(CompositeType.UNION) { @@ -169,7 +169,7 @@ fun VisionLayout.showcaseCSG() { sphere(50) { detail = 32 } - color("lightgreen") + color.set("lightgreen") opacity = 0.7 } composite(CompositeType.SUBTRACT) { @@ -180,7 +180,7 @@ fun VisionLayout.showcaseCSG() { sphere(50) { detail = 32 } - color("teal") + color.set("teal") opacity = 0.7 } } @@ -191,7 +191,7 @@ fun VisionLayout.showcaseCSG() { detail = 32 } box(100, 100, 100) - color("red") + color.set("red") opacity = 0.5 } } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index af828f46..84a164c8 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.asValue import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.set -import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.* @@ -72,7 +71,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision var value: Int get() = meta[VALUE].int ?: 0 set(value) { - setProperty(VALUE, value.asValue()) + setPropertyValue(VALUE, value.asValue()) } companion object { diff --git a/docs/hierarchy.md b/docs/hierarchy.md index 720af5d2..15f3306e 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -3,7 +3,7 @@ ![](../docs/images/hierarchy.png) ### Vision -* function `getPropertyValue(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. +* function `getProperty(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. * function `setProperty(name: Name, item: Any?)` - a convenient method to set property node or value. If `item` is null, then node is removed, not a value Sets the `item` property to the element with the `name` identification. diff --git a/docs/inheritance.md b/docs/inheritance.md index d99451f3..1fad27d2 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -7,7 +7,7 @@ Properties, which can be inherited by objects, are `styles`, `prototypes` (if th All values of `styles` property are contained in class `StyleSheet`, where they all are defined at `Group`s level. The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and `SolidReference` class helps to reuse a template object. -The order of inheritance of properties is set in function `getPropertyValue` in `VisionBase` class. +The order of inheritance of properties is set in function `getProperty` in `VisionBase` class. The order is this: * own styles * prototypes diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 04e873b9..f590a13e 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -3,7 +3,7 @@ interface Vision{ val parent: VisionGroup? - fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? + fun getProperty(name,inherit,includeStyles,includeDefaults): Value? } interface Solid{ @@ -81,7 +81,7 @@ Solid <--- Composite interface SolidReference{ val prototype: Solid - fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? + fun getProperty(name,inherit,includeStyles,includeDefaults): Value? } VisionGroup <---- SolidReference SolidReferenceGroup -- SolidReference @@ -91,7 +91,7 @@ class SolidReferenceGroup{ var properties: MutableMeta? val prototype: Solid val children: Map - fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? + fun getProperty(name,inherit,includeStyles,includeDefaults): Value? } VisionBase <-- SolidReferenceGroup VisionGroup <-- SolidReferenceGroup diff --git a/gradle.properties b/gradle.properties index 95d6d923..92f33679 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.jupyter.add.scanner=false org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.11.7-kotlin-1.7.0 \ No newline at end of file +toolsVersion=0.11.8-kotlin-1.7.10 \ No newline at end of file diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index e7602b0e..9ab0403c 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -10,8 +10,8 @@ import react.fc import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.react.visionTree +import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv @@ -51,7 +51,7 @@ public val ThreeControls: FC = fc { props -> val selectedObject: Vision? = when { selected == null -> null selected.isEmpty() -> props.vision - else -> (props.vision as? VisionGroup)?.get(selected) + else -> (props.vision as? SolidGroup)?.get(selected) } if (selectedObject != null) { visionPropertyEditor(selectedObject, key = selected) diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index a65c1f42..4393565a 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -2,13 +2,14 @@ package space.kscience.visionforge.bootstrap import org.w3c.dom.Element import react.RBuilder -import react.dom.render +import react.dom.client.createRoot import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.Vision import space.kscience.visionforge.computeProperties import space.kscience.visionforge.getStyle import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor +import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.styles @@ -50,6 +51,6 @@ public fun RBuilder.visionPropertyEditor( public fun Element.visionPropertyEditor( item: Vision, descriptor: MetaDescriptor? = item.descriptor, -): Unit = render(this) { +): Unit = createRoot(this).render { visionPropertyEditor(item, descriptor = descriptor) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 54fc8ec4..84f9347f 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -59,9 +59,9 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { val obj = props.obj //display as node if any child is visible - if (obj is VisionGroup) { + if (obj is VisionGroup<*>) { flexRow { - if (obj.children.any { !it.key.body.startsWith("@") }) { + if (obj.items.any { !it.key.body.startsWith("@") }) { styledSpan { css { +TreeStyles.treeCaret @@ -81,9 +81,9 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { css { +TreeStyles.tree } - obj.children.entries + obj.items.entries .filter { !it.key.toString().startsWith("@") } // ignore statics and other hidden children - .sortedBy { (it.value as? VisionGroup)?.isEmpty() ?: true } // ignore empty groups + .sortedBy { (it.value as? VisionGroup<*>)?.isEmpty() ?: true } // ignore empty groups .forEach { (childToken, child) -> styledDiv { css { @@ -92,7 +92,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { child(ObjectTree) { attrs { this.name = props.name + childToken - this.obj = child + this.obj = child.vision this.selected = props.selected this.clickCallback = props.clickCallback } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index fa3fab99..085ff608 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -108,7 +108,7 @@ public val ThreeCanvasWithControls: FC = fc("Three selected?.let { when { it.isEmpty() -> solid - else -> (solid as? VisionGroup)?.get(it) + else -> (solid as? SolidGroup)?.get(it) } } } @@ -165,7 +165,7 @@ public val ThreeCanvasWithControls: FC = fc("Three } IslandContent { propertyEditor( - ownProperties = vision.meta, + ownProperties = vision.properties(), allProperties = vision.computeProperties(), descriptor = vision.descriptor, key = selected diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 0937e26d..f9099a99 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -183,7 +183,7 @@ public class space/kscience/visionforge/SimpleVisionPropertyContainer : space/ks public fun (Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; - public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; } public final class space/kscience/visionforge/StyleReference { @@ -241,8 +241,8 @@ public abstract interface class space/kscience/visionforge/Vision : space/kscien public fun getManager ()Lspace/kscience/visionforge/VisionManager; public abstract fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; public abstract fun getParent ()Lspace/kscience/visionforge/VisionGroup; - public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public abstract fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; public abstract fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V public abstract fun setParent (Lspace/kscience/visionforge/VisionGroup;)V public abstract fun update (Lspace/kscience/visionforge/VisionChange;)V @@ -266,7 +266,7 @@ public class space/kscience/visionforge/VisionBase : space/kscience/visionforge/ protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; public fun getParent ()Lspace/kscience/visionforge/VisionGroup; protected final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; - public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V public fun setParent (Lspace/kscience/visionforge/VisionGroup;)V protected final fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V @@ -446,8 +446,8 @@ public final class space/kscience/visionforge/VisionGroupKt { public final class space/kscience/visionforge/VisionKt { public static final fun getPropertyChanges (Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/flow/Flow; - public static final fun getPropertyValue (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public static final fun getProperty (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getProperty$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;)V public static final fun setProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Object;)V @@ -499,8 +499,8 @@ public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/d public abstract interface class space/kscience/visionforge/VisionPropertyContainer { public abstract fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; - public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/VisionPropertyContainer;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public abstract fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getProperty$default (Lspace/kscience/visionforge/VisionPropertyContainer;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; } public final class space/kscience/visionforge/html/HeadersKt { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt new file mode 100644 index 00000000..c6cba1ba --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt @@ -0,0 +1,107 @@ +package space.kscience.visionforge + +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.asMutableMeta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.isEmpty +import space.kscience.dataforge.values.Value +import space.kscience.visionforge.VisionGroup.Companion.updateProperties +import kotlin.jvm.Synchronized + +@Serializable +public abstract class AbstractVision : Vision { + + @Transient + override var parent: Vision? = null + + protected var properties: MutableMeta? = null + + override val meta: Meta get() = properties ?: Meta.EMPTY + + @Synchronized + private fun getOrCreateProperties(): MutableMeta { + if (properties == null) { + //TODO check performance issues + val newProperties = MutableMeta() + properties = newProperties + } + return properties!! + } + + @Transient + private val _propertyChanges = MutableSharedFlow() + override val propertyChanges: SharedFlow get() = _propertyChanges + + override fun getPropertyValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean, + ): Value? { + properties?.get(name)?.value?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.value?.let { return it } + } + if (inherit) { + parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } + } + if (includeDefaults) { + descriptor?.defaultNode?.get(name)?.value?.let { return it } + } + return null + } + + override fun setProperty(name: Name, node: Meta?) { + //TODO check old value? + if (name.isEmpty()) { + properties = node?.asMutableMeta() + } else if (node == null) { + properties?.setMeta(name, node) + } else { + getOrCreateProperties().setMeta(name, node) + } + invalidateProperty(name) + } + + override fun setPropertyValue(name: Name, value: Value?) { + //TODO check old value? + if (value == null) { + properties?.getMeta(name)?.value = null + } else { + getOrCreateProperties().setValue(name, value) + } + invalidateProperty(name) + } + + override val descriptor: MetaDescriptor? get() = null + + override fun invalidateProperty(propertyName: Name) { + if (propertyName == Vision.STYLE_KEY) { + styles.asSequence() + .mapNotNull { getStyle(it) } + .flatMap { it.items.asSequence() } + .distinctBy { it.key } + .forEach { + invalidateProperty(it.key.asName()) + } + } + manager.context.launch { + _propertyChanges.emit(propertyName) + } + } + + override fun update(change: VisionChange) { + change.properties?.let { + updateProperties(it, Name.EMPTY) + } + } +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt deleted file mode 100644 index 925eecfe..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt +++ /dev/null @@ -1,84 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.MutableValueProvider -import space.kscience.dataforge.values.Value - -private class ComputedVisionProperties( - val vision: Vision, - val pathName: Name, - val visionDescriptor: MetaDescriptor, - val parentInheritFlag: Boolean?, - val parentStylesFlag: Boolean? -) : Meta { - - val descriptor: MetaDescriptor? by lazy { visionDescriptor[pathName] } - - override val items: Map - get() { - val metaKeys = vision.meta.getMeta(pathName)?.items?.keys ?: emptySet() - val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() - val inheritFlag = descriptor?.inherited ?: parentInheritFlag - val stylesFlag = descriptor?.usesStyles ?: parentStylesFlag - return (metaKeys + descriptorKeys).associateWith { - ComputedVisionProperties( - vision, - pathName + it, - visionDescriptor, - inheritFlag, - stylesFlag - ) - } - } - - override val value: Value? - get() { - val inheritFlag = descriptor?.inherited ?: parentInheritFlag ?: false - val stylesFlag = descriptor?.usesStyles ?: parentStylesFlag ?: true - return vision.getPropertyValue(pathName, inheritFlag, stylesFlag, true) - } - - override fun toString(): String = Meta.toString(this) - override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) - override fun hashCode(): Int = Meta.hashCode(this) -} - -/** - * Compute property node based on inheritance and style information from the descriptor - */ -public fun Vision.computeProperties(descriptor: MetaDescriptor? = this.descriptor): Meta = - if (descriptor == null) meta else ComputedVisionProperties(this, Name.EMPTY, descriptor, null, null) - -public fun Vision.computePropertyNode( - name: Name, - descriptor: MetaDescriptor? = this.descriptor -): Meta? = computeProperties(descriptor)[name] - -/** - * Compute the property based on the provided value descriptor. By default, use Vision own descriptor - */ -public fun Vision.computeProperty(name: Name, valueDescriptor: MetaDescriptor? = descriptor?.get(name)): Value? { - val inheritFlag = valueDescriptor?.inherited ?: false - val stylesFlag = valueDescriptor?.usesStyles ?: true - return getPropertyValue(name, inheritFlag, stylesFlag) -} - -/** - * Accessor to all vision properties - */ -public fun Vision.computePropertyValues( - descriptor: MetaDescriptor? = this.descriptor -): MutableValueProvider = object : MutableValueProvider { - override fun getValue(name: Name): Value? = computeProperty(name, descriptor?.get(name)) - - override fun setValue(name: Name, value: Value?) { - setProperty(name, value) - } -} - diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt index d5dfac6e..0e2b6132 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt @@ -9,7 +9,7 @@ import kotlin.properties.ReadOnlyProperty /** * A reference to a style defined in a specific container */ -public class StyleReference(public val owner: VisionGroup, public val name: String) +public class StyleReference(public val owner: Vision, public val name: String) private tailrec fun styleIsDefined(vision: Vision, reference: StyleReference): Boolean = when { reference.owner === vision -> true @@ -25,7 +25,7 @@ public fun Vision.useStyle(reference: StyleReference) { } @VisionBuilder -public fun VisionGroup.style( +public fun Vision.style( styleKey: String? = null, builder: MutableMeta.() -> Unit, ): ReadOnlyProperty = ReadOnlyProperty { _, property -> @@ -35,7 +35,7 @@ public fun VisionGroup.style( } @VisionBuilder -public fun VisionGroup.style( +public fun Vision.style( spec: Specification, styleKey: String? = null, builder: T.() -> Unit, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 52deee3c..cc465d87 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -5,7 +5,6 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.stringList import kotlin.jvm.JvmInline @@ -14,11 +13,11 @@ import kotlin.jvm.JvmInline * A container for styles */ @JvmInline -public value class StyleSheet(private val owner: VisionGroup) { +public value class StyleSheet(private val owner: Vision) { - private val styleNode: Meta? get() = owner.meta[STYLESHEET_KEY] + private val styleNode: Meta get() = owner.getProperty(STYLESHEET_KEY) - public val items: Map? get() = styleNode?.items + public val items: Map get() = styleNode.items public operator fun get(key: String): Meta? = owner.getStyle(key) @@ -26,7 +25,7 @@ public value class StyleSheet(private val owner: VisionGroup) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.meta.setMeta(STYLESHEET_KEY + key, style) + owner.setProperty(STYLESHEET_KEY + key, style) } /** @@ -43,7 +42,7 @@ public value class StyleSheet(private val owner: VisionGroup) { /** * Create and set a style */ - public operator fun set(key: String, builder: MutableMeta.() -> Unit) { + public fun update(key: String, builder: MutableMeta.() -> Unit) { val newStyle = get(key)?.toMutableMeta()?.apply(builder) ?: Meta(builder) set(key, newStyle.seal()) } @@ -61,10 +60,8 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) .map { it.asName() } tokens.forEach { parent?.invalidateProperty(it) } } - if (this is VisionGroup) { - for (obj in this) { - obj.styleChanged(key, oldStyle, newStyle) - } + children.values.forEach { vision -> + vision.styleChanged(key, oldStyle, newStyle) } } @@ -73,35 +70,40 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = meta.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList() + get() = getPropertyValue( + Vision.STYLE_KEY, + inherit = true, + includeStyles = false, + includeDefaults = false + )?.stringList ?: emptyList() set(value) { - meta.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) + setPropertyValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } /** * A stylesheet for this group and its descendants. Stylesheet is not applied directly, * but instead is just a repository for named configurations. */ -public val VisionGroup.styleSheet: StyleSheet get() = StyleSheet(this) +public val Vision.styleSheet: StyleSheet get() = StyleSheet(this) /** * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String) { - styles = (meta.getMeta(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name + styles = (getPropertyValue(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name } /** - * Find a style with given name for given [Vision]. The style is not necessary applied to this [Vision]. + * Resolve a style with given name for given [Vision]. The style is not necessarily applied to this [Vision]. */ -public tailrec fun Vision.getStyle(name: String): Meta? = +public fun Vision.getStyle(name: String): Meta? = meta.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) /** * Resolve a property from all styles */ -public fun Vision.getStyleProperty(name: Name): Value? = styles.firstNotNullOfOrNull { getStyle(it)?.get(name)?.value } +public fun Vision.getStyleProperty(name: Name): Meta? = styles.firstNotNullOfOrNull { getStyle(it)?.get(name) } /** * Resolve an item in all style layers diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 1c8e3a28..b25f200c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -1,17 +1,20 @@ package space.kscience.visionforge -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.launch -import space.kscience.dataforge.meta.* +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.MutableMetaProvider import space.kscience.dataforge.meta.descriptors.Described import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue @@ -23,38 +26,59 @@ import kotlin.reflect.KProperty1 * A root type for display hierarchy */ @Type(TYPE) -public interface Vision : Described, Configurable { +public interface Vision : Described { /** * The parent object of this one. If null, this one is a root. */ - public var parent: VisionGroup? + public var parent: Vision? /** * Owner [VisionManager]. Used to define coroutine scope a serialization */ - public val manager: VisionManager? get() = parent?.manager + public val manager: VisionManager get() = parent?.manager ?: Global.visionManager + + public val children: VisionChildren /** - * This Vision own properties (ignoring inheritance, styles and defaults) + * Own properties without inheritance or styles. */ - override val meta: ObservableMutableMeta + public val meta: Meta - /** - * Get property value with given layer flags. - * @param inherit toggles parent node property lookup. Null means inference from descriptor. Default is false. - * @param includeStyles toggles inclusion of properties from styles. default is true - */ public fun getPropertyValue( name: Name, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean, ): Value? + /** + * Get property with given layer flags. + * @param inherit toggles parent node property lookup. Null means inference from descriptor. + * @param includeStyles toggles inclusion of properties from styles. + */ + public fun getProperty( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean, + ): MutableMeta = VisionProperties(this, name, descriptor?.get(name), inherit, includeStyles) + + public fun setProperty( + name: Name, + node: Meta?, + ) + + public fun setPropertyValue( + name: Name, + value: Value?, + ) + + public val propertyChanges: SharedFlow /** - * Notify all listeners that a property has been changed and should be invalidated + * Notify all listeners that a property has been changed and should be invalidated. + * This method does not check that the property has actually changed. */ public fun invalidateProperty(propertyName: Name) @@ -68,80 +92,135 @@ public interface Vision : Described, Configurable { public companion object { public const val TYPE: String = "vision" public val STYLE_KEY: Name = "@style".asName() + public const val STYLE_TARGET: String = "style" public val VISIBLE_KEY: Name = "visible".asName() } } -/** - * Flow of property invalidation events. It does not contain property values after invalidation since it is not clear - * if it should include inherited properties etc. - */ -@OptIn(ExperimentalCoroutinesApi::class) -@DFExperimental -public val Vision.propertyChanges: Flow - get() = callbackFlow { - meta.onChange(this) { name -> - launch { - send(name) - } - } - awaitClose { - meta.removeListener(this) - } - } +public fun Vision.getPropertyValue( + name: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, + includeDefaults: Boolean = true, + metaDescriptor: MetaDescriptor? = descriptor?.get(name), +): Value? { + val inheritFlag = inherit ?: metaDescriptor?.inherited ?: false + val stylesFlag = includeStyles ?: metaDescriptor?.usesStyles ?: true + return getPropertyValue(name, inheritFlag, stylesFlag, includeDefaults) +} + +public fun Vision.getPropertyValue( + name: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, + includeDefaults: Boolean = true, + metaDescriptor: MetaDescriptor? = descriptor?.get(name), +): Value? = getPropertyValue(name.parseAsName(), inherit, includeStyles, includeDefaults, metaDescriptor) /** - * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled + * Compute the property based on the provided value descriptor. By default, use Vision own descriptor */ -public fun Vision.onPropertyChange(callback: Meta.(Name) -> Unit) { - meta.onChange(null, callback) +public fun Vision.getProperty( + name: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, + includeDefaults: Boolean = true, + metaDescriptor: MetaDescriptor? = descriptor?.get(name), +): MutableMeta { + val inheritFlag = inherit ?: metaDescriptor?.inherited ?: false + val stylesFlag = includeStyles ?: metaDescriptor?.usesStyles ?: true + return getProperty(name, inheritFlag, stylesFlag, includeDefaults) } + /** * Get [Vision] property using key as a String */ -public fun Vision.getPropertyValue( - key: String, - inherit: Boolean = false, - includeStyles: Boolean = true, +public fun Vision.getProperty( + name: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, includeDefaults: Boolean = true, -): Value? = getPropertyValue(Name.parse(key), inherit, includeStyles, includeDefaults) + metaDescriptor: MetaDescriptor? = descriptor?.get(name), +): MutableMeta = getProperty(name.parseAsName(), inherit, includeStyles, includeDefaults, metaDescriptor) + /** - * A convenience method to set property node or value. If Item is null, then node is removed, not a value + * Vision's own non-inheritable, non-styleable properties */ -public fun Vision.setProperty(name: Name, item: Any?) { - when (item) { - null -> meta.remove(name) - is Meta -> meta.setMeta(name, item) - is Value -> meta.setValue(name, item) - else -> meta.setValue(name, Value.of(item)) +public fun Vision.properties( + inherit: Boolean? = null, + useStyles: Boolean? = null, +): MutableMetaProvider = VisionProperties(this, Name.EMPTY, inherit = inherit, useStyles = useStyles) + +public fun Vision.setPropertyValue(name: Name, value: Number?) { + if (value == null) { + setPropertyValue(name, null) + } else { + setPropertyValue(name, value.asValue()) } } -public fun Vision.setPropertyNode(key: String, item: Any?) { - setProperty(Name.parse(key), item) +public fun Vision.setPropertyValue(name: String, value: Number?): Unit = + setPropertyValue(name.parseAsName(), value) + +public fun Vision.setPropertyValue(name: Name, value: Boolean?) { + if (value == null) { + setPropertyValue(name, null) + } else { + setPropertyValue(name, value.asValue()) + } } +public fun Vision.setPropertyValue(name: String, value: Boolean?): Unit = + setPropertyValue(name.parseAsName(), value) + +public fun Vision.setPropertyValue(name: Name, value: String?) { + if (value == null) { + setPropertyValue(name, null) + } else { + setPropertyValue(name, value.asValue()) + } +} + +public fun Vision.setPropertyValue(name: String, value: String?): Unit = + setPropertyValue(name.parseAsName(), value) + /** * Control visibility of the element */ public var Vision.visible: Boolean? get() = getPropertyValue(Vision.VISIBLE_KEY)?.boolean - set(value) = meta.setValue(Vision.VISIBLE_KEY, value?.asValue()) + set(value) { + setPropertyValue(Vision.VISIBLE_KEY, value) + } + +/** + * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled + */ +public fun Vision.onPropertyChange(callback: (Name) -> Unit): Job = propertyChanges.onEach { + callback(it) +}.launchIn(manager.context) public fun V.useProperty( property: KProperty1, - owner: Any? = null, callBack: V.(T) -> Unit, -) { +): Job { //Pass initial value. callBack(property.get(this)) - meta.onChange(owner) { name -> + return propertyChanges.onEach { name -> if (name.startsWith(property.name.asName())) { callBack(property.get(this@useProperty)) } - } -} \ No newline at end of file + }.launchIn(manager.context) +} + + +public interface MutableVisionGroup : Vision { + + override val children: MutableVisionChildren + + public fun createGroup(): MutableVisionGroup +} diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt deleted file mode 100644 index 003fec79..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ /dev/null @@ -1,176 +0,0 @@ -package space.kscience.visionforge - -import kotlinx.serialization.EncodeDefault -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.ObservableMutableMeta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.value -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.ValueType -import space.kscience.visionforge.Vision.Companion.STYLE_KEY -import kotlin.jvm.Synchronized - -internal data class MetaListener( - val owner: Any? = null, - val callback: Meta.(name: Name) -> Unit, -) - -/** - * A full base implementation for a [Vision] - * @param parent the parent object for this vision. Could've set later. Not serialized. - */ -@Serializable -@SerialName("vision") -public open class VisionBase( - @Transient override var parent: VisionGroup? = null, - @EncodeDefault protected var properties: MutableMeta? = null, -) : Vision { - - @Synchronized - protected fun getOrCreateProperties(): MutableMeta { - if (properties == null) { - val newProperties = MutableMeta() - properties = newProperties - } - return properties!! - } - - @Transient - private val listeners: MutableList = mutableListOf() - - private inner class VisionProperties(val pathName: Name) : ObservableMutableMeta { - - override val items: Map - get() = properties?.get(pathName)?.items?.mapValues { entry -> - VisionProperties(pathName + entry.key) - } ?: emptyMap() - - override var value: Value? - get() = properties?.get(pathName)?.value - set(value) { - val oldValue = properties?.get(pathName)?.value - getOrCreateProperties().setValue(pathName, value) - if (oldValue != value) { - invalidate(Name.EMPTY) - } - } - - override fun getOrCreate(name: Name): ObservableMutableMeta = VisionProperties(pathName + name) - - override fun setMeta(name: Name, node: Meta?) { - getOrCreateProperties().setMeta(pathName + name, node) - invalidate(name) - } - - @DFExperimental - override fun attach(name: Name, node: ObservableMutableMeta) { - val ownProperties = getOrCreateProperties() - if (ownProperties is ObservableMutableMeta) { - ownProperties.attach(pathName + name, node) - } else { - ownProperties.setMeta(pathName + name, node) - node.onChange(this) { childName -> - ownProperties.setMeta(pathName + name + childName, this[childName]) - } - } - } - - override fun invalidate(name: Name) { - invalidateProperty(pathName + name) - } - - @Synchronized - override fun onChange(owner: Any?, callback: Meta.(name: Name) -> Unit) { - if (pathName.isEmpty()) { - listeners.add((MetaListener(owner, callback))) - } else { - listeners.add(MetaListener(owner) { name -> - if (name.startsWith(pathName)) { - (this@MetaListener[pathName] ?: Meta.EMPTY).callback(name.removeHeadOrNull(pathName)!!) - } - }) - } - } - - @Synchronized - override fun removeListener(owner: Any?) { - listeners.removeAll { it.owner === owner } - } - - override fun toString(): String = Meta.toString(this) - override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) - override fun hashCode(): Int = Meta.hashCode(this) - } - - final override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) - - override fun getPropertyValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Value? { - properties?.get(name)?.value?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.let { return it } - } - if (inherit) { - parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } - } - if (includeDefaults) { - descriptor?.defaultNode?.get(name)?.value.let { return it } - } - return null - } - - override val descriptor: MetaDescriptor? get() = null - - override fun invalidateProperty(propertyName: Name) { - if (propertyName == STYLE_KEY) { - styles.mapNotNull { getStyle(it) }.asSequence() - .flatMap { it.items.asSequence() } - .distinctBy { it.key } - .forEach { - invalidateProperty(it.key.asName()) - } - } - listeners.forEach { it.callback(properties ?: Meta.EMPTY, propertyName) } - } - - override fun update(change: VisionChange) { - change.properties?.let { - updateProperties(Name.EMPTY, it) - } - } - - public companion object { - public val descriptor: MetaDescriptor = MetaDescriptor { - value(STYLE_KEY, ValueType.STRING) { - multiple = true - } - } - - public fun Vision.updateProperties(at: Name, item: Meta) { - meta.setValue(at, item.value) - item.items.forEach { (token, item) -> - updateProperties(at + token, item) - } - } - - } -} - -//fun VisualObject.findStyle(styleName: Name): Meta? { -// if (this is VisualGroup) { -// val style = resolveStyle(styleName) -// if (style != null) return style -// } -// return parent?.findStyle(styleName) -//} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index ad0d0d70..abea638a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.Null @@ -19,14 +18,13 @@ import kotlin.time.Duration */ private fun Vision.deepCopy(): Vision { //Assuming that unrooted visions are already isolated - val manager = this.manager ?: return this //TODO replace by efficient deep copy val json = manager.encodeToJsonElement(this) return manager.decodeFromJson(json) } /** - * An update for a [Vision] or a [VisionGroup] + * An update for a [Vision] */ public class VisionChangeBuilder : VisionContainerBuilder { @@ -87,7 +85,6 @@ public inline fun VisionChange(block: VisionChangeBuilder.() -> Unit): VisionCha VisionChangeBuilder().apply(block).deepCopy() -@OptIn(DFExperimental::class) private fun CoroutineScope.collectChange( name: Name, source: Vision, @@ -96,28 +93,25 @@ private fun CoroutineScope.collectChange( //Collect properties change source.onPropertyChange { propertyName -> - val newItem = source.meta[propertyName] + val newItem = source.getProperty(propertyName, false, false, false) collector().propertyChanged(name, propertyName, newItem) } - if (source is VisionGroup) { - //Subscribe for children changes - source.children.forEach { (token, child) -> - collectChange(name + token, child, collector) - } - - //Subscribe for structure change - if (source is MutableVisionGroup) { - source.structureChanges.onEach { changedName -> - val after = source[changedName] - val fullName = name + changedName - if (after != null) { - collectChange(fullName, after, collector) - } - collector()[fullName] = after - }.launchIn(this) - } + val children = source.children + //Subscribe for children changes + for ((token, child) in children) { + collectChange(name + token, child, collector) } + + //Subscribe for structure change + children.changes.onEach { changedName -> + val after = children[changedName] + val fullName = name + changedName + if (after != null) { + collectChange(fullName, after, collector) + } + collector()[fullName] = after + }.launchIn(this) } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt new file mode 100644 index 00000000..f7056d59 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -0,0 +1,196 @@ +package space.kscience.visionforge + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.launch +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.serializer +import space.kscience.dataforge.names.* + +@DslMarker +public annotation class VisionBuilder + +public interface VisionContainer { + public operator fun get(name: Name): V? +} + +public interface VisionContainerBuilder { + //TODO add documentation + public operator fun set(name: Name?, child: V?) +} + +/** + * A serializable representation of [Vision] children container + */ +public interface VisionChildren : VisionContainer { + public val parent: Vision? + + public val keys: Set + + public val values: Iterable get() = keys.map { get(it)!! } + + public val changes: Flow + + public operator fun get(token: NameToken): Vision? + + override fun get(name: Name): Vision? = when (name.length) { + 0 -> parent + 1 -> get(name.first()) + else -> get(name.first())?.children?.get(name.cutFirst()) + } + + public companion object { + public fun empty(owner: Vision): VisionChildren = object : VisionChildren { + override val parent: Vision get() = owner + override val keys: Set get() = emptySet() + override val changes: Flow get() = emptyFlow() + override fun get(token: NameToken): Vision? = null + } + } +} + +public fun VisionChildren.isEmpty(): Boolean = keys.isEmpty() + +@Serializable(VisionChildrenContainerSerializer::class) +public interface MutableVisionChildren : VisionChildren, VisionContainerBuilder { + public override val parent: MutableVisionGroup? + + public operator fun set(token: NameToken, value: Vision?) + + override fun set(name: Name?, child: Vision?) { + when { + name == null -> { + if (child != null) { + static(child) + } + } + + name.isEmpty() -> error("Empty names are not allowed in VisionGroup::set") + name.length == 1 -> { + val token = name.tokens.first() + set(token, child) + } + + else -> { + val currentParent = get(name.first()) + if (currentParent != null && currentParent !is MutableVisionGroup) error("Can't assign a child to $currentParent") + val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: parent?.createGroup().also { + set(name.first(), it) + } ?: error("Container owner not set") + parent.children[name.cutFirst()] = child + } + } + } + + public fun clear() +} + +/** + * Add a static child. Statics could not be found by name, removed or replaced. Changing statics also do not trigger events. + */ +public fun MutableVisionChildren.static(child: Vision): Unit { + set(NameToken("@static", index = child.hashCode().toString()), child) +} + +public fun VisionChildren.asSequence(): Sequence> = sequence { + keys.forEach { yield(it to get(it)!!) } +} + +public operator fun VisionChildren.iterator(): Iterator> = asSequence().iterator() + +public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) + +public operator fun VisionContainerBuilder.set( + str: String?, vision: V?, +): Unit = set(str?.parseAsName(), vision) + +internal class VisionChildrenImpl( + items: Map, +) : MutableVisionChildren { + + override var parent: MutableVisionGroup? = null + internal set + + private val items = LinkedHashMap(items) + private val updateJobs = HashMap() + + private val scope: CoroutineScope? get() = parent?.manager?.context + + override val keys: Set get() = items.keys + + override fun get(token: NameToken): Vision? = items[token] + + private val _changes = MutableSharedFlow() + override val changes: SharedFlow get() = _changes + + private fun onChange(name: Name) { + scope?.launch { + _changes.emit(name) + } + } + + override operator fun set(token: NameToken, value: Vision?) { + //fast return if value equals existing + if (value == get(token)) return + + val currentUpdateJob = updateJobs[token] + if (currentUpdateJob != null) { + currentUpdateJob.cancel() + updateJobs.remove(token) + } + + if (value == null) { + items.remove(token) + } else { + items[token] = value + //check if parent already exists and is different from the current one + if (value.parent != null && value.parent != parent) error("Can't reassign parent Vision for $value") + //set parent + value.parent = parent + //start update jobs (only if the vision is rooted) + scope?.let { scope -> + val job = (value.children as? VisionChildrenImpl)?.changes?.onEach { + onChange(token + it) + }?.launchIn(scope) + if (job != null) { + updateJobs[token] = job + } + } + } + + onChange(token.asName()) + } + + override fun clear() { + if (items.isNotEmpty()) { + updateJobs.values.forEach { + it.cancel() + } + updateJobs.clear() + items.clear() + onChange(Name.EMPTY) + } + } +} + +internal object VisionChildrenContainerSerializer : KSerializer { + private val mapSerializer = serializer>() + + override val descriptor: SerialDescriptor = mapSerializer.descriptor + + override fun deserialize(decoder: Decoder): MutableVisionChildren { + val map = decoder.decodeSerializableValue(mapSerializer) + return VisionChildrenImpl(map) + } + + override fun serialize(encoder: Encoder, value: MutableVisionChildren) { + val map = value.keys.associateWith { value[it]!! } + encoder.encodeSerializableValue(mapSerializer, map) + } + +} diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index a8ad1dcd..3c843b85 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -1,109 +1,99 @@ package space.kscience.visionforge -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.launch -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.names.* -import space.kscience.dataforge.provider.Provider - -@DslMarker -public annotation class VisionBuilder - -public interface VisionContainer { - public operator fun get(name: Name): V? -} +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.ValueType +import space.kscience.visionforge.Vision.Companion.STYLE_KEY +import kotlin.jvm.Synchronized /** - * Represents a group of [Vision] instances + * A full base implementation for a [Vision] */ -public interface VisionGroup : Provider, Vision, VisionContainer { - /** - * A map of top level named children - */ - public val children: Map +@Serializable +@SerialName("vision.group") +public open class VisionGroup : AbstractVision(), MutableVisionGroup { - override val defaultTarget: String get() = Vision.TYPE - - /** - * A map of direct children for specific target - * (currently "visual" or "style") - */ - override fun content(target: String): Map = - when (target) { - Vision.TYPE -> children.flatMap { (key, value) -> - val res: Map = if (value is VisionGroup) { - value.content(target).mapKeys { key + it.key } - } else { - mapOf(key.asName() to value) - } - res.entries - }.associate { it.toPair() } - STYLE_TARGET -> styleSheet.items?.mapKeys { it.key.asName() } ?: emptyMap() - else -> emptyMap() - } - - public override operator fun get(name: Name): Vision? { - return when { - name.isEmpty() -> this - name.length == 1 -> children[name.tokens.first()] - else -> (children[name.tokens.first()] as? VisionGroup)?.get(name.cutFirst()) - } - } - - public companion object { - public const val STYLE_TARGET: String = "style" - } -} - -/** - * Iterate over children of this group - */ -public operator fun VisionGroup.iterator(): Iterator = children.values.iterator() - -public fun VisionGroup.isEmpty(): Boolean = this.children.isEmpty() - -public interface VisionContainerBuilder { - //TODO add documentation - public operator fun set(name: Name?, child: V?) -} - -/** - * Mutable version of [VisionGroup] - */ -public interface MutableVisionGroup : VisionGroup, VisionContainerBuilder { - public fun onStructureChanged(owner: Any?, block: VisionGroup.(Name) -> Unit) - - public fun removeStructureListener(owner: Any?) -} - - -/** - * Flow structure changes of this group. Unconsumed changes are discarded - */ -@OptIn(ExperimentalCoroutinesApi::class) -@DFExperimental -public val MutableVisionGroup.structureChanges: Flow - get() = callbackFlow { - meta.onChange(this) { name -> - launch { - send(name) + override fun update(change: VisionChange) { + change.children?.forEach { (name, change) -> + when { + change.delete -> children.set(name, null) + change.vision != null -> children.set(name, change.vision) + else -> children[name]?.update(change) } } - awaitClose { - removeStructureListener(this) + change.properties?.let { + updateProperties(it, Name.EMPTY) } } + @SerialName("children") + protected var _children: MutableVisionChildren? = null -public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) + @Transient + override val children: MutableVisionChildren = object : MutableVisionChildren { -public operator fun VisionContainerBuilder.set(token: NameToken, child: V?): Unit = - set(token.asName(), child) + @Synchronized + fun getOrCreateChildren(): MutableVisionChildren { + if (_children == null) { + _children = VisionChildrenImpl(emptyMap()).apply { + parent = this@VisionGroup + } + } + return _children!! + } -public operator fun VisionContainerBuilder.set(key: String?, child: V?): Unit = - set(key?.let(Name::parse), child) + override val parent: MutableVisionGroup get() = this@VisionGroup -public fun MutableVisionGroup.removeAll(): Unit = children.keys.map { it.asName() }.forEach { this[it] = null } \ No newline at end of file + override val keys: Set get() = _children?.keys ?: emptySet() + override val changes: Flow get() = _children?.changes ?: emptyFlow() + + override fun get(token: NameToken): Vision? = _children?.get(token) + + override fun set(token: NameToken, value: Vision?) { + getOrCreateChildren()[token] = value + } + + override fun set(name: Name?, child: Vision?) { + getOrCreateChildren()[name] = child + } + + override fun clear() { + _children?.clear() + } + } + + override fun createGroup(): VisionGroup = VisionGroup() + + public companion object { + public val descriptor: MetaDescriptor = MetaDescriptor { + value(STYLE_KEY, ValueType.STRING) { + multiple = true + } + } + + public fun Vision.updateProperties(item: Meta, at: Name = Name.EMPTY) { + setPropertyValue(at, item.value) + item.items.forEach { (token, item) -> + updateProperties(item, at + token) + } + } + + } +} + +//fun VisualObject.findStyle(styleName: Name): Meta? { +// if (this is VisualGroup) { +// val style = resolveStyle(styleName) +// if (style != null) return style +// } +// return parent?.findStyle(styleName) +//} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt deleted file mode 100644 index 7c2af29e..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ /dev/null @@ -1,168 +0,0 @@ -package space.kscience.visionforge - -import kotlinx.serialization.EncodeDefault -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import space.kscience.dataforge.names.* -import kotlin.jvm.Synchronized - -private class StructureChangeListener(val owner: Any?, val callback: VisionGroup.(Name) -> Unit) - -/** - * Abstract implementation of mutable group of [Vision] - * - * @param childrenInternal Internal mutable container for group children - */ -@Serializable -@SerialName("vision.group") -public open class VisionGroupBase( - @EncodeDefault @SerialName("children") protected val childrenInternal: MutableMap = LinkedHashMap(), -) : VisionBase(), MutableVisionGroup { - - /** - * A map of top level named children - */ - override val children: Map get() = childrenInternal - - init { - childrenInternal.forEach { (token, child) -> - if (child.parent != null && child.parent != this) error("Can't reassign existing parent for child $token") - child.parent = this - } - } - - override fun invalidateProperty(propertyName: Name) { - super.invalidateProperty(propertyName) - for (obj in this) { - obj.invalidateProperty(propertyName) - } - } - - @Transient - private val structureListeners = HashSet() - - @Synchronized - override fun onStructureChanged(owner: Any?, block: VisionGroup.(Name) -> Unit) { - structureListeners.add(StructureChangeListener(owner, block)) - } - - @Synchronized - override fun removeStructureListener(owner: Any?) { - structureListeners.removeAll { it.owner == owner } - } - - /** - * Propagate children change event upwards - */ - protected fun childrenChanged(name: Name) { - structureListeners.forEach { - it.callback(this, name) - } - } - - /** - * Add a static child. Statics could not be found by name, removed or replaced. Changing statics also do not trigger events. - */ - protected open fun addStatic(child: Vision): Unit { - attachChild(NameToken("@static", index = child.hashCode().toString()), child) - } - - /** - * Create a vision group of the same type as this vision group. Do not attach it. - */ - protected open fun createGroup(): VisionGroupBase = VisionGroupBase() - - /** - * Set parent for given child and attach it - */ - private fun attachChild(token: NameToken, child: Vision?) { - val before = childrenInternal[token] - when { - child == null -> { - childrenInternal.remove(token) - } - child.parent == null -> { - child.parent = this - childrenInternal[token] = child - } - child.parent !== this -> { - error("Can't reassign existing parent for child $token") - } - } - if (before != child) { - childrenChanged(token.asName()) - if (child is MutableVisionGroup) { - child.onStructureChanged(this) { changedName -> - this@VisionGroupBase.childrenChanged(token + changedName) - } - } - } - } - - /** - * Recursively create a child group - */ - private fun createGroups(name: Name): VisionGroupBase = when { - name.isEmpty() -> error("Should be unreachable") - name.length == 1 -> { - val token = name.tokens.first() - when (val current = children[token]) { - null -> createGroup().also { child -> - attachChild(token, child) - } - is VisionGroupBase -> current - else -> error("Can't create group with name $name because it exists and not a group") - } - } - else -> createGroups(name.tokens.first().asName()).createGroups(name.cutFirst()) - } - - /** - * Add named or unnamed child to the group. If key is null the child is considered unnamed. Both key and value are not - * allowed to be null in the same time. If name is present and [child] is null, the appropriate element is removed. - */ - override fun set(name: Name?, child: Vision?): Unit { - when { - name == null -> { - if (child != null) { - addStatic(child) - } - } - name.isEmpty() -> error("Empty names are not allowed in VisionGroup::set") - name.length == 1 -> { - val token = name.tokens.first() - attachChild(token, child) - } - else -> { - //TODO add safety check - val parent = (get(name.cutLast()) as? MutableVisionGroup) ?: createGroups(name.cutLast()) - parent[name.tokens.last().asName()] = child - } - } - } - - override fun update(change: VisionChange) { - change.children?.forEach { (name, change) -> - when { - change.delete -> set(name, null) - change.vision != null -> set(name, change.vision) - else -> get(name)?.update(change) - } - } - super.update(change) - } -} - -/** - * Non-serializable root group used to propagate manager to its children - */ -internal class RootVisionGroup(override val manager: VisionManager) : VisionGroupBase() - -/** - * Designate this [VisionGroup] as a root and assign a [VisionManager] as its parent - */ -public fun Vision.setAsRoot(manager: VisionManager) { - if (parent != null) error("Vision $this already has a parent. It could not be set as root") - parent = RootVisionGroup(manager) -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index cd017cad..a11ad358 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -25,13 +25,14 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { /** * Combined [SerializersModule] for all registered visions */ - public val serializersModule: SerializersModule - get() = SerializersModule { + public val serializersModule: SerializersModule by lazy { + SerializersModule { include(defaultSerialModule) context.gather(VISION_SERIALIZER_MODULE_TARGET).values.forEach { include(it) } } + } public val jsonFormat: Json get() = Json(defaultJson) { @@ -67,9 +68,8 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { private val defaultSerialModule: SerializersModule = SerializersModule { polymorphic(Vision::class) { - default { VisionBase.serializer() } - subclass(VisionBase.serializer()) - subclass(VisionGroupBase.serializer()) + default { VisionGroup.serializer() } + subclass(VisionGroup.serializer()) subclass(VisionOfNumberField.serializer()) subclass(VisionOfTextField.serializer()) subclass(VisionOfCheckbox.serializer()) @@ -107,5 +107,17 @@ public abstract class VisionPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(met */ public val Context.visionManager: VisionManager get() = fetch(VisionManager) -public fun Vision.encodeToString(): String = - manager?.encodeToString(this) ?: error("VisionManager not defined in Vision") \ No newline at end of file +public fun Vision.encodeToString(): String = manager.encodeToString(this) + +/** + * A root vision attached to [VisionManager] + */ +public class RootVision(override val manager: VisionManager) : VisionGroup() + +/** + * Designate this [Vision] as a root and assign a [VisionManager] as its parent + */ +public fun Vision.setAsRoot(manager: VisionManager) { + if (parent != null) error("Vision $this already has a parent. It could not be set as root") + parent = RootVision(manager) +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt new file mode 100644 index 00000000..140170d3 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -0,0 +1,81 @@ +package space.kscience.visionforge + +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.Value + +/** + * A wrapper that emulates delegates reading and writing properties to Vision method + */ +internal class VisionProperties( + val vision: Vision, + val nodeName: Name, + val visionDescriptor: MetaDescriptor? = vision.descriptor, + val inherit: Boolean? = null, + val useStyles: Boolean? = null, +) : MutableMeta { + + val descriptor: MetaDescriptor? by lazy { visionDescriptor?.get(nodeName) } + + override val items: Map + get() { + val metaKeys = vision.meta.getMeta(nodeName)?.items?.keys ?: emptySet() + val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() + val inheritFlag = descriptor?.inherited ?: inherit + val stylesFlag = descriptor?.usesStyles ?: useStyles + return (metaKeys + descriptorKeys).associateWith { + VisionProperties( + vision, + nodeName + it, + visionDescriptor, + inheritFlag, + stylesFlag + ) + } + } + + override var value: Value? + get() { + val inheritFlag = descriptor?.inherited ?: inherit ?: false + val stylesFlag = descriptor?.usesStyles ?: useStyles ?: true + return vision.getPropertyValue(nodeName, inheritFlag, stylesFlag, true) + } + set(value) { + vision.setPropertyValue(nodeName, value) + } + + override fun getOrCreate(name: Name): MutableMeta = VisionProperties( + vision, + nodeName + name, + visionDescriptor, + inherit, + useStyles + ) + + override fun setMeta(name: Name, node: Meta?) { + vision.setProperty(nodeName + name, node) + } + + override fun toString(): String = Meta.toString(this) + override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) + override fun hashCode(): Int = Meta.hashCode(this) +} + +///** +// * Accessor to all vision properties +// */ +//public fun Vision.computePropertyValues( +// descriptor: MetaDescriptor? = this.descriptor, +//): MutableValueProvider = object : MutableValueProvider { +// override fun getValue(name: Name): Value? = computeProperty(name, descriptor?.get(name))?.value +// +// override fun setValue(name: Name, value: Value?) { +// setProperty(name, value) +// } +//} + diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt index fed474fc..83b6c93c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt @@ -1,34 +1,29 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.Configurable +import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.ObservableMutableMeta -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.Value /** * Property containers are used to create a symmetric behaviors for vision properties and style builders */ public interface VisionPropertyContainer { - public val meta: MutableMeta - - public fun getPropertyValue( - name: Name, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, - ): Value? -} - -public open class SimpleVisionPropertyContainer( - override val meta: ObservableMutableMeta, -) : VisionPropertyContainer, Configurable { - override fun getPropertyValue( + public fun getProperty( name: Name, inherit: Boolean, includeStyles: Boolean, - includeDefaults: Boolean - ): Value? = meta[name]?.value + includeDefaults: Boolean, + ): Meta? +} + +public open class SimpleVisionPropertyContainer( + public val meta: MutableMeta, +) : VisionPropertyContainer { + override fun getProperty( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean, + ): Meta? = meta.getMeta(name) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index 0ef6f54e..82e59c2c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -9,13 +9,14 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node +import space.kscience.visionforge.properties @Serializable @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, ) : VisionOfHtmlInput() { - public var values: Meta? by meta.node() + public var values: Meta? by properties().node() } public class HtmlFormFragment internal constructor( diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt index 084c5b6b..34f49027 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt @@ -5,11 +5,12 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.number import space.kscience.dataforge.meta.string -import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.properties @Serializable -public abstract class VisionOfHtmlInput : VisionBase() { - public var disabled: Boolean by meta.boolean(false) +public abstract class VisionOfHtmlInput : VisionGroup() { + public var disabled: Boolean by properties().boolean(false) } @Serializable @@ -18,7 +19,7 @@ public class VisionOfTextField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var text: String? by meta.string() + public var text: String? by properties().string() } @Serializable @@ -27,7 +28,7 @@ public class VisionOfCheckbox( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var checked: Boolean? by meta.boolean() + public var checked: Boolean? by properties().boolean() } @Serializable @@ -36,7 +37,7 @@ public class VisionOfNumberField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var value: Number? by meta.number() + public var value: Number? by properties().number() } @Serializable @@ -48,6 +49,6 @@ public class VisionOfRangeField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var value: Number? by meta.number() + public var value: Number? by properties().number() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt index 999bbb45..185c98a9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt @@ -49,7 +49,7 @@ public fun Vision.propertyValue( getPropertyValue(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) override fun setValue(thisRef: Any?, property: KProperty<*>, value: Value?) { - meta.setValue(name ?: Name.parse(property.name), value) + setPropertyValue(name ?: Name.parse(property.name), value) } } @@ -69,7 +69,7 @@ public fun Vision.propertyValue( ).let(getter) override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - meta.setValue(name ?: Name.parse(property.name), value?.let(setter)) + setPropertyValue(name ?: Name.parse(property.name), value?.let(setter)) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt index 15ef9229..3fa6703f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.* import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.set private const val INHERITED_DESCRIPTOR_ATTRIBUTE = "inherited" private const val STYLE_DESCRIPTOR_ATTRIBUTE = "useStyles" diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/StatisticsVisitor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/StatisticsVisitor.kt index 0a60c3c0..5b989274 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/StatisticsVisitor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/StatisticsVisitor.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.visitor -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -11,7 +10,6 @@ import space.kscience.visionforge.Vision import kotlin.reflect.KClass -@OptIn(ExperimentalCoroutinesApi::class) public suspend fun Vision.flowStatistics(statistics: (Name, Vision) -> T): Flow = callbackFlow { val visitor = object : VisionVisitor { override suspend fun visit(name: Name, vision: Vision){ diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt index 0533dc4e..3ba313a9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.launch import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.iterator public interface VisionVisitor { /** @@ -19,30 +19,30 @@ public interface VisionVisitor { /** * Rearrange children of given group */ - public suspend fun visitChildren(name: Name, group: VisionGroup) { + public suspend fun visitChildren(name: Name, group: Vision) { //Do nothing by default } public fun skip(name: Name, vision: Vision): Boolean = false - public companion object{ + public companion object { private fun CoroutineScope.visitTreeAsync( visionVisitor: VisionVisitor, name: Name, - vision: Vision + vision: Vision, ): Job = launch { if (visionVisitor.skip(name, vision)) return@launch visionVisitor.visit(name, vision) - if (vision is VisionGroup) { - visionVisitor.visitChildren(name, vision) - for ((token, child) in vision.children) { - visitTreeAsync(visionVisitor, name + token, child) - } + visionVisitor.visitChildren(name, vision) + + for ((token, child) in vision.children) { + visitTreeAsync(visionVisitor, name + token, child) } } + /** * Recursively visit this [Vision] and all children */ diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 42a9ba1f..b7b8208d 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -4,13 +4,9 @@ import kotlinx.html.* import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.configure -import space.kscience.dataforge.meta.set import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionBase -import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.* import kotlin.collections.set import kotlin.test.Test @@ -36,7 +32,7 @@ fun FlowContent.renderVisionFragment( @DFExperimental class HtmlTagTest { - fun VisionOutput.base(block: VisionBase.() -> Unit) = VisionBase().apply(block) + fun VisionOutput.base(block: VisionGroup.() -> Unit) = VisionGroup().apply(block) val fragment: HtmlVisionFragment = { div { @@ -46,10 +42,8 @@ class HtmlTagTest { "metaProperty" put 87 } base { - configure { - set("myProp", 82) - set("otherProp", false) - } + setPropertyValue("myProp", 82) + setPropertyValue("otherProp", false) } } } @@ -59,7 +53,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - (vision as? VisionBase)?.meta?.items?.forEach { + vision.getProperty(Name.EMPTY).items.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 40b4c96e..234d0043 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,8 +1,16 @@ package space.kscience.visionforge.meta -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Scheme +import space.kscience.dataforge.meta.SchemeSpec +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.updateWith import space.kscience.dataforge.values.asValue -import space.kscience.visionforge.VisionBase +import space.kscience.dataforge.values.boolean +import space.kscience.dataforge.values.int +import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.getProperty +import space.kscience.visionforge.getPropertyValue +import space.kscience.visionforge.setPropertyValue import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals @@ -10,22 +18,22 @@ import kotlin.test.assertNotEquals class VisionPropertyTest { @Test fun testPropertyWrite(){ - val vision = VisionBase() - vision.meta["fff"] = 2 - vision.meta["fff.ddd"] = false + val vision = VisionGroup() + vision.setPropertyValue("fff", 2) + vision.setPropertyValue("fff.ddd", false) - assertEquals(2, vision.meta["fff"]?.int) - assertEquals(false, vision.meta["fff.ddd"]?.boolean) + assertEquals(2, vision.getPropertyValue("fff")?.int) + assertEquals(false, vision.getPropertyValue("fff.ddd")?.boolean) } @Test fun testPropertyEdit(){ - val vision = VisionBase() - vision.meta.getOrCreate("fff.ddd").apply { + val vision = VisionGroup() + vision.getProperty("fff.ddd").apply { value = 2.asValue() } - assertEquals(2, vision.meta["fff.ddd"]?.int) - assertNotEquals(true, vision.meta["fff.ddd"]?.boolean) + assertEquals(2, vision.getPropertyValue("fff.ddd")?.int) + assertNotEquals(true, vision.getPropertyValue("fff.ddd")?.boolean) } internal class TestScheme: Scheme(){ @@ -35,10 +43,10 @@ class VisionPropertyTest { @Test fun testPropertyUpdate(){ - val vision = VisionBase() - vision.meta.getOrCreate("fff").updateWith(TestScheme){ + val vision = VisionGroup() + vision.getProperty("fff").updateWith(TestScheme){ ddd = 2 } - assertEquals(2, vision.meta["fff.ddd"]?.int) + assertEquals(2, vision.getPropertyValue("fff.ddd")?.int) } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index bf1033ba..7b1299f4 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -6,11 +6,10 @@ import javafx.scene.Node import javafx.scene.Parent import javafx.scene.layout.VBox import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision -import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.getProperty import space.kscience.visionforge.getStyle import space.kscience.visionforge.styles import tornadofx.* @@ -21,8 +20,8 @@ public class VisionEditorFragment : Fragment() { public var vision: Vision? by visionProperty public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - private val configProperty: Binding = visionProperty.objectBinding { vision -> - vision?.meta + private val configProperty: Binding = visionProperty.objectBinding { vision -> + vision?.getProperty(Name.EMPTY) } private val configEditorProperty: Binding = configProperty.objectBinding(descriptorProperty) { @@ -30,7 +29,7 @@ public class VisionEditorFragment : Fragment() { val node:FXMetaModel = FXMetaModel( meta, vision?.descriptor, - vision?.computeProperties(), + vision?.meta, Name.EMPTY, "Vision properties" ) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt index 335b5a69..c0c1dfa4 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt @@ -5,17 +5,17 @@ import javafx.scene.control.SelectionMode import javafx.scene.control.TreeItem import javafx.scene.layout.VBox import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.solid.SolidGroup import tornadofx.* private fun toTreeItem(vision: Vision, title: String): TreeItem> { return object : TreeItem>(title to vision) { init { - if (vision is VisionGroup) { + if (vision is SolidGroup) { //lazy populate the tree expandedProperty().onChange { expanded -> if (expanded && children.isEmpty()) { - children.setAll(vision.children.map { + children.setAll(vision.items.map { toTreeItem(it.value, it.key.toString()) }) } @@ -24,7 +24,7 @@ private fun toTreeItem(vision: Vision, title: String): TreeItem referenceFactory(obj, binding) + is SolidReference -> referenceFactory(obj, binding) is SolidGroup -> { - Group(obj.children.mapNotNull { (token, obj) -> + Group(obj.items.mapNotNull { (token, obj) -> (obj as? Solid)?.let { logger.info { token.toString() } buildNode(it).apply { @@ -77,7 +77,7 @@ public class FX3DPlugin : AbstractPlugin() { is PolyLine -> PolyLine3D( obj.points.map { Point3D(it.x, it.y, it.z) }, obj.thickness.toFloat(), - obj.computePropertyNode(SolidMaterial.MATERIAL_COLOR_KEY)?.color() + obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).color() ).apply { this.meshView.cullFace = CullFace.FRONT } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index af00f7c5..60b95f9f 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -8,20 +8,21 @@ import space.kscience.dataforge.names.firstOrNull import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX import kotlin.reflect.KClass -public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { - override val type: KClass get() = SolidReferenceGroup::class +public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { + override val type: KClass get() = SolidReference::class - override fun invoke(obj: SolidReferenceGroup, binding: VisualObjectFXBinding): Node { + override fun invoke(obj: SolidReference, binding: VisualObjectFXBinding): Node { val prototype = obj.prototype val node = plugin.buildNode(prototype) obj.onPropertyChange { name-> - if (name.firstOrNull()?.body == SolidReferenceGroup.REFERENCE_CHILD_PROPERTY_PREFIX) { + if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() - val referenceChild = obj[childName] ?: error("Reference child with name '$childName' not found") + val referenceChild = obj.children[childName] ?: error("Reference child with name '$childName' not found") val child = node.findChild(childName) ?: error("Object child with name '$childName' not found") child.updateProperty(referenceChild, propertyName) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 607913d7..680033d4 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -7,7 +7,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision -import space.kscience.visionforge.computePropertyNode +import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange import tornadofx.* @@ -36,7 +36,7 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi public operator fun get(key: Name): ObjectBinding { return bindings.getOrPut(key) { object : ObjectBinding() { - override fun computeValue(): Meta? = obj.computePropertyNode(key) + override fun computeValue(): Meta = obj.getProperty(key) } } } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt index 442cde3c..976db192 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt @@ -6,7 +6,7 @@ import space.kscience.dataforge.names.Name import space.kscience.gdml.* import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial -import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.set import space.kscience.visionforge.useStyle import kotlin.random.Random @@ -44,7 +44,7 @@ public class GdmlLoaderOptions { * Configure paint for given solid with given [GdmlMaterial] */ public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = - { material, _ -> color(randomColor(material)) } + { material, _ -> color.set(randomColor(material)) } private set public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index f80a5511..34a9afa2 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -30,10 +30,10 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { private val proto = SolidGroup() private val solids = proto.group(solidsName) { - setPropertyNode("edges.enabled", false) + setPropertyValue("edges.enabled", false) } - private val referenceStore = HashMap>() + private val referenceStore = HashMap>() fun Solid.configureSolid(root: Gdml, parent: GdmlVolume, solid: GdmlSolid) { val material = parent.materialref.resolve(root) ?: GdmlElement(parent.materialref.ref) @@ -44,7 +44,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { } } - private fun proxySolid(root: Gdml, group: SolidGroup, solid: GdmlSolid, name: String): SolidReferenceGroup { + private fun proxySolid(root: Gdml, group: SolidGroup, solid: GdmlSolid, name: String): SolidReference { val templateName = solidsName + name if (proto[templateName] == null) { solids.addSolid(root, solid, name) @@ -59,7 +59,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { group: SolidGroup, physVolume: GdmlPhysVolume, volume: GdmlGroup, - ): SolidReferenceGroup { + ): SolidReference { val templateName = volumesName + volume.name.asName() if (proto[templateName] == null) { proto[templateName] = volume(root, volume) @@ -321,7 +321,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { ?: error("Volume with ref ${divisionVolume.volumeref.ref} could not be resolved") //TODO add divisions - set(null, volume(root, volume)) + children.static(volume(root, volume)) } private fun volume( @@ -355,7 +355,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { final.useStyle(rootStyle) final.prototypes { - proto.children.forEach { (token, item) -> + proto.items.forEach { (token, item) -> item.parent = null set(token.asName(), item as? Solid) } @@ -383,9 +383,9 @@ public fun Gdml.toVision(block: GdmlLoaderOptions.() -> Unit = {}): SolidGroup { * Append Gdml node to the group */ public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoaderOptions.() -> Unit = {}) { - val visual = gdml.toVision(transformer) + val vision = gdml.toVision(transformer) //println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual)) - set(key, visual) + children[key] = vision } @VisionBuilder diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt index befc69bb..afc6c99a 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt @@ -6,10 +6,9 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.length import space.kscience.dataforge.names.plus -import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.SolidReferenceGroup +import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.solid.layer @@ -23,15 +22,15 @@ private class VisionCounterTree( var selfCount = 1 val children: Map by lazy { - (vision as? VisionGroup)?.children?.mapValues { (key, vision) -> - if (vision is SolidReferenceGroup) { - prototypes.getOrPut(vision.refName) { - VisionCounterTree(vision.refName, vision.prototype, prototypes) + (vision as? SolidGroup)?.items?.mapValues { (key, vision) -> + if (vision is SolidReference) { + prototypes.getOrPut(vision.prototypeName) { + VisionCounterTree(vision.prototypeName, vision.prototype, prototypes) }.apply { selfCount += 1 } } else { - VisionCounterTree(name + key, vision as Solid, prototypes) + VisionCounterTree(name + key, vision, prototypes) } } ?: emptyMap() } @@ -51,10 +50,10 @@ private fun VisionCounterTree.topToBottom(): Sequence = seque } public fun SolidGroup.markLayers(thresholds: List = listOf(500, 1000, 20000, 50000)) { - val logger = manager?.context?.logger + val logger = manager.context.logger val counterTree = VisionCounterTree(Name.EMPTY, this, hashMapOf()) val totalCount = counterTree.childrenCount - if (totalCount > thresholds.firstOrNull() ?: 0) { + if (totalCount > (thresholds.firstOrNull() ?: 0)) { val allNodes = counterTree.topToBottom().distinct().toMutableList() //println("tree construction finished") allNodes.sortWith( diff --git a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt index 0ca76fd1..948ad214 100644 --- a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt +++ b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt @@ -21,12 +21,12 @@ class TestCubes { @Test fun testCubesDirect() { - val vision = cubes.toVision() + val vision: SolidGroup = cubes.toVision() // println(Solids.encodeToString(vision)) val smallBoxPrototype = vision.getPrototype(Name.parse("solids.smallBox")) as? Box assertNotNull(smallBoxPrototype) assertEquals(30.0, smallBoxPrototype.xSize.toDouble()) - val smallBoxVision = vision["composite-111.smallBox"]?.unref as? Box + val smallBoxVision = vision.children["composite-111.smallBox"]?.unref as? Box assertNotNull(smallBoxVision) assertEquals(30.0, smallBoxVision.xSize.toDouble()) } @@ -55,7 +55,7 @@ class TestCubes { assertNotNull(this.prototype) } if (this is SolidGroup) { - children.forEach { + items.forEach { it.value.checkPrototypes() } } diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index 87682978..93e7359e 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -9,17 +9,18 @@ import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.properties @Serializable @SerialName("vision.markup") public class VisionOfMarkup( public val format: String = COMMONMARK_FORMAT -) : VisionBase() { +) : VisionGroup() { //TODO add templates - public var content: String? by meta.string(CONTENT_PROPERTY_KEY) + public var content: String? by properties().string(CONTENT_PROPERTY_KEY) public companion object { public val CONTENT_PROPERTY_KEY: Name = "content".asName() diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index ebb4773c..880a1961 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,21 +2,24 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.asObservable import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly -import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.getProperty import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") -public class VisionOfPlotly private constructor() : VisionBase() { +public class VisionOfPlotly private constructor() : VisionGroup() { public constructor(plot: Plot) : this() { - properties = plot.meta + setProperty(Name.EMPTY, plot.meta) } - public val plot: Plot get() = Plot(meta) + public val plot: Plot get() = Plot(getProperty(Name.EMPTY).asObservable()) } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 7d55771c..bb88fa22 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -8,7 +8,7 @@ import io.ktor.server.engine.embeddedServer import io.ktor.server.html.respondHtml import io.ktor.server.http.content.resources import io.ktor.server.http.content.static -import io.ktor.server.plugins.cors.CORS +import io.ktor.server.plugins.cors.routing.CORS import io.ktor.server.response.respond import io.ktor.server.response.respondText import io.ktor.server.routing.* @@ -18,7 +18,6 @@ import io.ktor.server.websocket.webSocket import io.ktor.websocket.Frame import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api index 34c11260..c763e3c8 100644 --- a/visionforge-solid/api/visionforge-solid.api +++ b/visionforge-solid/api/visionforge-solid.api @@ -717,7 +717,7 @@ public final class space/kscience/visionforge/solid/SolidMaterialKt { } public abstract interface class space/kscience/visionforge/solid/SolidReference : space/kscience/visionforge/VisionGroup { - public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; public abstract fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; } @@ -728,7 +728,7 @@ public final class space/kscience/visionforge/solid/SolidReferenceGroup : space/ public fun (Lspace/kscience/dataforge/names/Name;)V public fun getChildren ()Ljava/util/Map; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; public fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; public final fun getRefName ()Lspace/kscience/dataforge/names/Name; public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidReferenceGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 0f9abc4d..39b7e7b0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -1,12 +1,13 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.Configurable import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors +import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.getProperty import kotlin.properties.ReadOnlyProperty @VisionBuilder @@ -27,8 +28,8 @@ public class ColorAccessor( } } -public fun Configurable.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> - ColorAccessor(meta, property.name.asName()) +public fun Vision.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> + ColorAccessor(getProperty(Name.EMPTY), property.name.asName()) } public var ColorAccessor?.string: String? @@ -40,21 +41,21 @@ public var ColorAccessor?.string: String? /** * Set [webcolor](https://en.wikipedia.org/wiki/Web_colors) as string */ -public operator fun ColorAccessor?.invoke(webColor: String) { +public fun ColorAccessor?.set(webColor: String) { this?.value = webColor.asValue() } /** * Set color as RGB integer */ -public operator fun ColorAccessor?.invoke(rgb: Int) { +public fun ColorAccessor?.set(rgb: Int) { this?.value = Colors.rgbToString(rgb).asValue() } /** * Set color as RGB */ -public operator fun ColorAccessor?.invoke(r: UByte, g: UByte, b: UByte) { +public fun ColorAccessor?.set(r: UByte, g: UByte, b: UByte) { this?.value = Colors.rgbToString(r, g, b).asValue() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index d63e08b6..d300b06b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -3,11 +3,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.isEmpty -import space.kscience.dataforge.meta.update -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.VisionPropertyContainer -import space.kscience.visionforge.set +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.* public enum class CompositeType { GROUP, // Dumb sum of meshes @@ -28,16 +25,16 @@ public class Composite( public inline fun VisionContainerBuilder.composite( type: CompositeType, name: String? = null, - builder: SolidGroup.() -> Unit, + @VisionBuilder builder: SolidGroup.() -> Unit, ): Composite { - val group = SolidGroup().apply(builder) - val children = group.children.values.filterIsInstance() - if (children.size != 2){ + val group = SolidGroup(builder) + val children = group.items.values.toList() + if (children.size != 2) { error("Composite requires exactly two children, but found ${children.size}") } val res = Composite(type, children[0], children[1]) - res.meta.update(group.meta) + res.setProperty(Name.EMPTY, group.getProperty(Name.EMPTY)) set(name, res) return res @@ -50,34 +47,34 @@ public inline fun VisionContainerBuilder.composite( public fun SolidGroup.smartComposite( type: CompositeType, name: String? = null, - builder: SolidGroup.() -> Unit, + @VisionBuilder builder: SolidGroup.() -> Unit, ): Solid = if (type == CompositeType.GROUP) { val group = SolidGroup(builder) if (name == null && group.meta.isEmpty()) { //append directly to group if no properties are defined - group.children.forEach { (_, value) -> + group.items.forEach { (_, value) -> value.parent = null - set(null, value) + children.static(value) } this } else { - set(name, group) + children[name] = group group } } else { - composite(type, name, builder) + children.composite(type, name, builder) } @VisionBuilder public inline fun VisionContainerBuilder.union( name: String? = null, - builder: SolidGroup.() -> Unit + builder: SolidGroup.() -> Unit, ): Composite = composite(CompositeType.UNION, name, builder = builder) @VisionBuilder public inline fun VisionContainerBuilder.subtract( name: String? = null, - builder: SolidGroup.() -> Unit + builder: SolidGroup.() -> Unit, ): Composite = composite(CompositeType.SUBTRACT, name, builder = builder) @VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 30ecb575..6e5a8bb7 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta -import space.kscience.dataforge.meta.configure +import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos @@ -40,7 +40,7 @@ public data class Layer(var x: Float, var y: Float, var z: Float, var scale: Flo @SerialName("solid.extrude") public class Extruded( public val shape: List, - public val layers: List + public val layers: List, ) : SolidBase(), GeometrySolid, VisionPropertyContainer { override fun toGeometry(geometryBuilder: GeometryBuilder) { @@ -67,7 +67,7 @@ public class Extruded( for (i in (1 until layers.size)) { upperLayer = layers[i] for (j in (0 until shape.size - 1)) { - //counter clockwise + //counterclockwise geometryBuilder.face4( lowerLayer[j], lowerLayer[j + 1], @@ -99,7 +99,7 @@ public class ExtrudeBuilder( public var layers: MutableList = ArrayList(), - config: ObservableMutableMeta = MutableMeta() + config: ObservableMutableMeta = MutableMeta(), ) : SimpleVisionPropertyContainer(config) { public fun shape(block: Shape2DBuilder.() -> Unit) { this.shape = Shape2DBuilder().apply(block).build() @@ -110,12 +110,12 @@ public class ExtrudeBuilder( } internal fun build(): Extruded = Extruded(shape, layers).apply { - configure(this@ExtrudeBuilder.meta) + setProperty(Name.EMPTY, getProperty(Name.EMPTY)) } } @VisionBuilder public fun VisionContainerBuilder.extruded( name: String? = null, - action: ExtrudeBuilder.() -> Unit = {} + action: ExtrudeBuilder.() -> Unit = {}, ): Extruded = ExtrudeBuilder().apply(action).build().also { set(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt deleted file mode 100644 index 617c7a38..00000000 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt +++ /dev/null @@ -1,11 +0,0 @@ -package space.kscience.visionforge.solid - -import kotlin.jvm.JvmInline - -@JvmInline -public value class Quaternion(public val values: DoubleArray) - -public operator fun Quaternion.component1(): Double = values[0] -public operator fun Quaternion.component2(): Double = values[1] -public operator fun Quaternion.component3(): Double = values[2] -public operator fun Quaternion.component4(): Double = values[3] \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 2b9c883b..c3111d4e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -6,16 +6,12 @@ import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* -import space.kscience.visionforge.Vision +import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY -import space.kscience.visionforge.hide -import space.kscience.visionforge.inherited -import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY import space.kscience.visionforge.solid.Solid.Companion.IGNORE_KEY import space.kscience.visionforge.solid.Solid.Companion.LAYER_KEY @@ -38,7 +34,7 @@ import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty /** - * Interface for 3-dimensional [Vision] + * Interface for a [Vision] representing a 3D object */ public interface Solid : Vision { @@ -121,7 +117,7 @@ public interface Solid : Vision { public var Solid.layer: Int get() = getPropertyValue(LAYER_KEY, inherit = true)?.int ?: 0 set(value) { - setProperty(LAYER_KEY, value) + setPropertyValue(LAYER_KEY, value) } // Common properties @@ -140,23 +136,23 @@ public enum class RotationOrder { */ public var Solid.rotationOrder: RotationOrder get() = getPropertyValue(Solid.ROTATION_ORDER_KEY)?.enum() ?: RotationOrder.XYZ - set(value) = meta.setValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) + set(value) = setPropertyValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) /** * Preferred number of polygons for displaying the object. If not defined, uses shape or renderer default. Not inherited */ public var Solid.detail: Int? - get() = getPropertyValue(DETAIL_KEY, false)?.int - set(value) = meta.setValue(DETAIL_KEY, value?.asValue()) + get() = getPropertyValue(DETAIL_KEY, inherit = false)?.int + set(value) = setPropertyValue(DETAIL_KEY, value?.asValue()) /** * If this property is true, the object will be ignored on render. * Property is not inherited. */ public var Vision.ignore: Boolean? - get() = getPropertyValue(IGNORE_KEY, false)?.boolean - set(value) = meta.setValue(IGNORE_KEY, value?.asValue()) + get() = getPropertyValue(IGNORE_KEY, inherit = false)?.boolean + set(value) = setPropertyValue(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? // get() = getProperty(SELECTED_KEY).boolean @@ -165,18 +161,18 @@ public var Vision.ignore: Boolean? internal fun float(name: Name, default: Number): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Number { - return thisRef.meta.getMeta(name)?.number ?: default + return thisRef.getPropertyValue(name)?.number ?: default } override fun setValue(thisRef: Solid, property: KProperty<*>, value: Number) { - thisRef.setProperty(name, value) + thisRef.setPropertyValue(name, value) } } internal fun point(name: Name, default: Float): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { - val item = thisRef.meta.getMeta(name) ?: return null + val item = thisRef.meta[name] ?: return null return object : Point3D { override val x: Float get() = item[X_KEY]?.float ?: default override val y: Float get() = item[Y_KEY]?.float ?: default @@ -186,11 +182,11 @@ internal fun point(name: Name, default: Float): ReadWriteProperty, value: Point3D?) { if (value == null) { - thisRef.meta.setMeta(name, null) + thisRef.setProperty(name, null) } else { - thisRef.setProperty(name + X_KEY, value.x) - thisRef.setProperty(name + Y_KEY, value.y) - thisRef.setProperty(name + Z_KEY, value.z) + thisRef.setPropertyValue(name + X_KEY, value.x) + thisRef.setPropertyValue(name + Y_KEY, value.y) + thisRef.setPropertyValue(name + Z_KEY, value.z) } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 70e2501e..6d4b2faf 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,11 +2,24 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.visionforge.VisionBase +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.AbstractVision +import space.kscience.visionforge.VisionChildren @Serializable @SerialName("solid") -public open class SolidBase : VisionBase(), Solid { +public open class SolidBase : AbstractVision(), Solid { override val descriptor: MetaDescriptor get() = Solid.descriptor + override val children: VisionChildren get() = VisionChildren.empty(this) + + override fun getProperty( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean, + ): MutableMeta { + return super.getProperty(name, inherit, includeStyles, includeDefaults) + } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 76d0708b..20528056 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -7,6 +7,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.visionforge.* + /** * A container with prototype support */ @@ -23,20 +24,26 @@ public interface PrototypeHolder { public fun getPrototype(name: Name): Solid? } + /** - * Represents 3-dimensional Visual Group - * @param prototypes A container for templates visible inside this group + * A [Solid] group with additional accessor methods */ @Serializable @SerialName("group.solid") -public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { +public class SolidGroup : VisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, VisionContainerBuilder { - override val children: Map get() = super.childrenInternal.filter { it.key != PROTOTYPES_TOKEN } + public val items: Map + get() = children.keys.mapNotNull { + val value = children[it] as? Solid ?: return@mapNotNull null + it to value + }.toMap() - private var prototypes: MutableVisionGroup? - get() = childrenInternal[PROTOTYPES_TOKEN] as? MutableVisionGroup + public operator fun get(name: Name): Solid? = children[name] as? Solid + + private var prototypes: SolidGroup? + get() = items[PROTOTYPES_TOKEN] as? SolidGroup set(value) { - set(PROTOTYPES_TOKEN, value) + children[PROTOTYPES_TOKEN] = value } @@ -53,36 +60,38 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { * Create or edit prototype node as a group */ override fun prototypes(builder: VisionContainerBuilder.() -> Unit): Unit { - (prototypes ?: SolidGroup().also { - prototypes = it - }).run(builder) + (prototypes ?: SolidGroup().also { prototypes = it }).children.run(builder) } override fun createGroup(): SolidGroup = SolidGroup() - // // override fun update(change: VisionChange) { // updatePosition(change.properties) // super.update(change) // } + override fun set(name: Name?, child: Solid?) { + children[name] = child + } + public companion object { public val PROTOTYPES_TOKEN: NameToken = NameToken("@prototypes") } } -@Suppress("FunctionName") -public fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) +public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) @VisionBuilder -public fun VisionContainerBuilder.group( +public fun VisionContainerBuilder.group( name: Name? = null, builder: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup().apply(builder).also { set(name, it) } +): SolidGroup = SolidGroup(builder).also { set(name, it) } /** * Define a group with given [name], attach it to this parent and return it. */ @VisionBuilder -public fun VisionContainerBuilder.group(name: String, action: SolidGroup.() -> Unit = {}): SolidGroup = - SolidGroup().apply(action).also { set(name, it) } +public fun VisionContainerBuilder.group( + name: String, + action: SolidGroup.() -> Unit = {}, +): SolidGroup = SolidGroup(action).also { set(name, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 75d1f5a3..c68af09c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -9,6 +9,7 @@ import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.ValueType import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.number +import space.kscience.dataforge.values.set import space.kscience.visionforge.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY @@ -101,19 +102,19 @@ public class SolidMaterial : Scheme() { } public val Solid.color: ColorAccessor - get() = ColorAccessor(computePropertyValues(), MATERIAL_COLOR_KEY) + get() = ColorAccessor(getProperty(Name.EMPTY), MATERIAL_COLOR_KEY) public var Solid.material: SolidMaterial? - get() = computePropertyNode(MATERIAL_KEY)?.let { SolidMaterial.read(it) } - set(value) = meta.setMeta(MATERIAL_KEY, value?.meta) + get() = SolidMaterial.read(getProperty(MATERIAL_KEY)) + set(value) = setProperty(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - meta.getOrCreate(MATERIAL_KEY).updateWith(SolidMaterial, builder) + getProperty(MATERIAL_KEY).updateWith(SolidMaterial, builder) } public var Solid.opacity: Number? get() = getPropertyValue(MATERIAL_OPACITY_KEY, inherit = true)?.number set(value) { - meta.setValue(MATERIAL_OPACITY_KEY, value?.asValue()) + setPropertyValue(MATERIAL_OPACITY_KEY, value?.asValue()) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 04c54907..8e6e6f59 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -1,38 +1,15 @@ package space.kscience.visionforge.solid +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.emptyFlow import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.ObservableMutableMeta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.visionforge.* - - -public interface SolidReference : VisionGroup { - /** - * The prototype for this reference. - */ - public val prototype: Solid - - override fun getPropertyValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean - ): Value? { - meta[name]?.value?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.let { return it } - } - prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } - if (inherit) { - parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } - } - return null - } -} +import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX /** @@ -46,103 +23,116 @@ public val Vision.unref: Solid else -> error("This Vision is neither Solid nor SolidReference") } -private fun childToken(childName: Name): NameToken = - NameToken(SolidReferenceGroup.REFERENCE_CHILD_PROPERTY_PREFIX, childName.toString()) - -private fun childPropertyName(childName: Name, propertyName: Name): Name = - childToken(childName) + propertyName - /** - * A reference [Solid] to reuse a template object + * @param name A name of reference child relative to prototype root */ -@Serializable -@SerialName("solid.ref") -public class SolidReferenceGroup( - public val refName: Name, -) : VisionBase(), SolidReference, VisionGroup, Solid { +internal class SolidReferenceChild( + val owner: SolidReference, + override var parent: Vision?, + val childName: Name, +) : Solid { - /** - * Recursively search for defined template in the parent - */ - override val prototype: Solid by lazy { - if (parent == null) error("No parent is present for SolidReferenceGroup") - if (parent !is PrototypeHolder) error("Parent does not hold prototypes") - (parent as? PrototypeHolder)?.getPrototype(refName) ?: error("Prototype with name $refName not found") - } + val prototype: Solid + get() = owner.prototype.children[childName] as? Solid + ?: error("Prototype with name $childName not found") - override val children: Map - get() = (prototype as? VisionGroup)?.children - ?.filter { it.key != SolidGroup.PROTOTYPES_TOKEN } - ?.mapValues { - ReferenceChild(this, it.key.asName()) - } ?: emptyMap() + override val meta: Meta get() = owner.getProperty(childToken(childName).asName()) override fun getPropertyValue( name: Name, inherit: Boolean, includeStyles: Boolean, - includeDefaults: Boolean - ): Value? = super.getPropertyValue(name, inherit, includeStyles, includeDefaults) - - override val descriptor: MetaDescriptor get() = prototype.descriptor - - - /** - * A ProxyChild is created temporarily only to interact with properties, it does not store any values - * (properties are stored in external cache) and created and destroyed on-demand). - */ - private class ReferenceChild( - val owner: SolidReferenceGroup, - private val refName: Name - ) : SolidReference, VisionGroup, Solid { - - override val prototype: Solid by lazy { - if (refName.isEmpty()) { - owner.prototype - } else { - val proto = (owner.prototype as? VisionGroup)?.get(refName) - ?: error("Prototype with name $refName not found in SolidReferenceGroup ${owner.refName}") - proto as? Solid ?: error("Prototype with name $refName is ${proto::class} but expected Solid") -// proto.unref as? Solid -// ?: error("Prototype with name $refName is ${proto::class} but expected Solid") - } + includeDefaults: Boolean, + ): Value? { + owner.getPropertyValue( + childPropertyName(childName, name), inherit, includeStyles, includeDefaults + )?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.value?.let { return it } } - - override val meta: ObservableMutableMeta by lazy { - owner.meta.getOrCreate(childToken(refName).asName()) + prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } + if (inherit) { + parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } } - - override val children: Map - get() = (prototype as? VisionGroup)?.children - ?.filter { it.key != SolidGroup.PROTOTYPES_TOKEN } - ?.mapValues { (key, _) -> - ReferenceChild(owner, refName + key.asName()) - } ?: emptyMap() - - override var parent: VisionGroup? - get() { - val parentName = refName.cutLast() - return if (parentName.isEmpty()) owner else ReferenceChild(owner, parentName) - } - set(_) { - error("Setting a parent for a reference child is not possible") - } - - override fun invalidateProperty(propertyName: Name) { - owner.invalidateProperty(childPropertyName(refName, propertyName)) - } - - override fun update(change: VisionChange) { - change.properties?.let { - updateProperties(Name.EMPTY, it) - } - } - - override val descriptor: MetaDescriptor get() = prototype.descriptor - + return null } - public companion object { + override fun setProperty(name: Name, node: Meta?) { + owner.setProperty(childPropertyName(childName, name), node) + } + + override fun setPropertyValue(name: Name, value: Value?) { + owner.setPropertyValue(childPropertyName(childName, name), value) + } + + override val propertyChanges: SharedFlow + get() = TODO("Not yet implemented") + + override fun invalidateProperty(propertyName: Name) { + owner.invalidateProperty(childPropertyName(childName, propertyName)) + } + + override fun update(change: VisionChange) { + TODO("Not yet implemented") + } + + + override val children: VisionChildren = object : VisionChildren { + override val parent: Vision get() = this@SolidReferenceChild + + override val keys: Set get() = prototype.children.keys + + override val changes: Flow get() = emptyFlow() + + override fun get(token: NameToken): SolidReferenceChild? { + if (token !in prototype.children.keys) return null + return SolidReferenceChild(this@SolidReferenceChild.owner, this@SolidReferenceChild, childName + token) + } + } + + companion object { + + private fun childToken(childName: Name): NameToken = + NameToken(REFERENCE_CHILD_PROPERTY_PREFIX, childName.toString()) + + private fun childPropertyName(childName: Name, propertyName: Name): Name = + childToken(childName) + propertyName + + } +} + +@Serializable +@SerialName("solid.ref") +public class SolidReference( + @SerialName("prototype") public val prototypeName: Name, +) : SolidBase() { + + /** + * The prototype for this reference. + */ + public val prototype: Solid by lazy { + //Recursively search for defined template in the parent + if (parent == null) error("No parent is present for SolidReference") + if (parent !is PrototypeHolder) error("Parent does not hold prototypes") + (parent as? PrototypeHolder)?.getPrototype(prototypeName) + ?: error("Prototype with name $prototypeName not found") + } + + override val children: VisionChildren + get() = object : VisionChildren { + override val parent: Vision get() = this@SolidReference + + override val keys: Set get() = prototype.children.keys + + override val changes: Flow get() = emptyFlow() + + override fun get(token: NameToken): SolidReferenceChild? { + if (token !in prototype.children.keys) return null + return SolidReferenceChild(this@SolidReference, this@SolidReference, token.asName()) + } + } + + public companion object{ public const val REFERENCE_CHILD_PROPERTY_PREFIX: String = "@child" } } @@ -150,33 +140,123 @@ public class SolidReferenceGroup( /** * Create ref for existing prototype */ -public fun SolidGroup.ref( +public fun VisionContainerBuilder.ref( templateName: Name, name: String? = null, -): SolidReferenceGroup = SolidReferenceGroup(templateName).also { set(name, it) } +): SolidReference = SolidReference(templateName).also { set(name, it) } -public fun SolidGroup.ref( +public fun VisionContainerBuilder.ref( templateName: String, name: String? = null, -): SolidReferenceGroup = ref(Name.parse(templateName), name) +): SolidReference = ref(Name.parse(templateName), name) /** - * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes. - * One must ensure that [prototypeHolder] is a parent of this group. + * Add new [SolidReference] wrapping given object and automatically adding it to the prototypes. */ public fun SolidGroup.newRef( name: String?, obj: Solid, - prototypeHolder: PrototypeHolder = this, - templateName: Name = Name.parse(name ?: obj.toString()), -): SolidReferenceGroup { - val existing = getPrototype(templateName) + prototypeHolder: SolidGroup = this, + prototypeName: Name = Name.parse(name ?: obj.toString()), +): SolidReference { + val existing = prototypeHolder.getPrototype(prototypeName) if (existing == null) { prototypeHolder.prototypes { - set(templateName, obj) + set(prototypeName, obj) } } else if (existing != obj) { error("Can't add different prototype on top of existing one") } - return ref(templateName, name) + return children.ref(prototypeName, name) } + + +// +// +///** +// * A reference [Solid] to reuse a template object +// */ +//@Serializable +//@SerialName("solid.ref") +//public class SolidReferenceGroup( +// public val refName: Name, +//) : VisionGroup(), SolidReference, VisionGroup, Solid { +// +// /** +// * Recursively search for defined template in the parent +// */ +// override val prototype: Solid by lazy { +// if (parent == null) error("No parent is present for SolidReferenceGroup") +// if (parent !is PrototypeHolder) error("Parent does not hold prototypes") +// (parent as? PrototypeHolder)?.getPrototype(refName) ?: error("Prototype with name $refName not found") +// } +// +// override val items: Map> +// get() = (prototype as? VisionGroup<*>)?.items +// ?.filter { it.key != SolidGroup.PROTOTYPES_TOKEN } +// ?.mapValues { +// VisionGroupItem.Node(ReferenceChild(this, it.key.asName())) +// } ?: emptyMap() +// +// override val descriptor: MetaDescriptor get() = prototype.descriptor +// +// +// /** +// * A ProxyChild is created temporarily only to interact with properties, it does not store any values +// * (properties are stored in external cache) and created and destroyed on-demand). +// */ +// private class ReferenceChild( +// val owner: SolidReferenceGroup, +// private val refName: Name, +// ) : SolidReference, VisionGroup, Solid { +// +// override val prototype: Solid by lazy { +// if (refName.isEmpty()) { +// owner.prototype +// } else { +// val proto = (owner.prototype).children.get(refName) +// ?: error("Prototype with name $refName not found in SolidReferenceGroup ${owner.refName}") +// proto as? Solid ?: error("Prototype with name $refName is ${proto::class} but expected Solid") +//// proto.unref as? Solid +//// ?: error("Prototype with name $refName is ${proto::class} but expected Solid") +// } +// } +// +// override val meta: ObservableMutableMeta by lazy { +// owner.meta.getOrCreate(childToken(refName).asName()) +// } +// +// override val items: Map> +// get() = (prototype as? VisionGroup<*>)?.items +// ?.filter { it.key != SolidGroup.PROTOTYPES_TOKEN } +// ?.mapValues { (key, _) -> +// VisionGroupItem.Node(ReferenceChild(owner, refName + key.asName())) +// } ?: emptyMap() +// +// override var parent: VisionGroup<*>? +// get() { +// val parentName = refName.cutLast() +// return if (parentName.isEmpty()) owner else ReferenceChild(owner, parentName) +// } +// set(_) { +// error("Setting a parent for a reference child is not possible") +// } +// +// override fun invalidateProperty(propertyName: Name) { +// owner.invalidateProperty(childPropertyName(refName, propertyName)) +// } +// +// override fun update(change: VisionChange) { +// change.properties?.let { +// updateProperties(it, Name.EMPTY) +// } +// } +// +// override val descriptor: MetaDescriptor get() = prototype.descriptor +// +// } +// +// public companion object { +// public const val REFERENCE_CHILD_PROPERTY_PREFIX: String = "@child" +// } +//} diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index b43d6475..6e9d00d9 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -29,7 +29,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { private fun PolymorphicModuleBuilder.solids() { subclass(SolidGroup.serializer()) - subclass(SolidReferenceGroup.serializer()) + subclass(SolidReference.serializer()) subclass(Composite.serializer()) subclass(Box.serializer()) subclass(GenericHexagon.serializer()) @@ -47,8 +47,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { public val serializersModuleForSolids: SerializersModule = SerializersModule { polymorphic(Vision::class) { - subclass(VisionBase.serializer()) - subclass(VisionGroupBase.serializer()) + subclass(VisionGroup.serializer()) solids() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt index bae8d83d..45305e4a 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt @@ -21,7 +21,7 @@ public class Sphere( ) : SolidBase(), GeometrySolid, VisionPropertyContainer { override fun toGeometry(geometryBuilder: GeometryBuilder) { - fun point3DfromSphCoord(r: Float, theta: Float, phi: Float): Point3D { + fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Point3D { // This transformation matches three.js sphere implementation val y = r * cos(theta) val z = r * sin(theta) * sin(phi) @@ -39,10 +39,10 @@ public class Sphere( for (j in 0 until segments) { // phi iteration val phi1 = phiStart + j * phiStep val phi2 = phi1 + phiStep - val point1 = point3DfromSphCoord(radius, theta1, phi1) - val point2 = point3DfromSphCoord(radius, theta1, phi2) - val point3 = point3DfromSphCoord(radius, theta2, phi2) - val point4 = point3DfromSphCoord(radius, theta2, phi1) + val point1 = point3dFromSphCoord(radius, theta1, phi1) + val point2 = point3dFromSphCoord(radius, theta1, phi2) + val point3 = point3dFromSphCoord(radius, theta2, phi2) + val point4 = point3dFromSphCoord(radius, theta2, phi1) geometryBuilder.apply { // 1-2-3-4 gives the same face but with opposite orientation face4(point1, point4, point3, point2) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt index 05149e2e..b5ae5500 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt @@ -27,7 +27,7 @@ public class SphereLayer( require(outerRadius > 0) { "Outer radius must be positive" } require(innerRadius >= 0) { "inner radius must be non-negative" } - fun point3DfromSphCoord(r: Float, theta: Float, phi: Float): Point3D { + fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Point3D { // This transformation matches three.js sphere implementation val y = r * cos(theta) val z = r * sin(theta) * sin(phi) @@ -46,17 +46,17 @@ public class SphereLayer( val phi1 = phiStart + j * phiStep val phi2 = phi1 + phiStep //outer points - val outerPoint1 = point3DfromSphCoord(outerRadius, theta1, phi1) - val outerPoint2 = point3DfromSphCoord(outerRadius, theta1, phi2) - val outerPoint3 = point3DfromSphCoord(outerRadius, theta2, phi2) - val outerPoint4 = point3DfromSphCoord(outerRadius, theta2, phi1) + val outerPoint1 = point3dFromSphCoord(outerRadius, theta1, phi1) + val outerPoint2 = point3dFromSphCoord(outerRadius, theta1, phi2) + val outerPoint3 = point3dFromSphCoord(outerRadius, theta2, phi2) + val outerPoint4 = point3dFromSphCoord(outerRadius, theta2, phi1) // 1-2-3-4 gives the same face but with opposite orientation face4(outerPoint1, outerPoint4, outerPoint3, outerPoint2) if (innerRadius > 0) { - val innerPoint1 = point3DfromSphCoord(innerRadius, theta1, phi1) - val innerPoint2 = point3DfromSphCoord(innerRadius, theta1, phi2) - val innerPoint3 = point3DfromSphCoord(innerRadius, theta2, phi2) - val innerPoint4 = point3DfromSphCoord(innerRadius, theta2, phi1) + val innerPoint1 = point3dFromSphCoord(innerRadius, theta1, phi1) + val innerPoint2 = point3dFromSphCoord(innerRadius, theta1, phi2) + val innerPoint3 = point3dFromSphCoord(innerRadius, theta2, phi2) + val innerPoint4 = point3dFromSphCoord(innerRadius, theta2, phi1) face4(innerPoint1, innerPoint2, innerPoint3, innerPoint4) //the cup if (i == segments - 1 && theta != PI.toFloat() && innerRadius != outerRadius) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index a0ad09a0..e9c9c146 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -112,9 +112,9 @@ public fun Point3D.toMeta(): Meta = Meta { internal fun Meta.toVector(default: Float = 0f) = Point3D( - this[Solid.X_KEY].float ?: default, - this[Solid.Y_KEY].float ?: default, - this[Solid.Z_KEY].float ?: default + this[X_KEY].float ?: default, + this[Y_KEY].float ?: default, + this[Z_KEY].float ?: default ) //internal fun Solid.updatePosition(meta: Meta?) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index e74b47f0..aa53d424 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -5,6 +5,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.scheme import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name +import space.kscience.dataforge.values.set import space.kscience.visionforge.hide import space.kscience.visionforge.widgetType diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index 39aadbf1..bab2e518 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -1,31 +1,26 @@ package space.kscience.visionforge.solid.transform -import space.kscience.dataforge.meta.configure -import space.kscience.dataforge.meta.update import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.* +import space.kscience.visionforge.getProperty import space.kscience.visionforge.solid.* private operator fun Number.plus(other: Number) = toFloat() + other.toFloat() private operator fun Number.times(other: Number) = toFloat() * other.toFloat() @DFExperimental -internal fun Vision.updateFrom(other: Vision): Vision { - if (this is Solid && other is Solid) { - x += other.x - y += other.y - z += other.y - rotationX += other.rotationX - rotationY += other.rotationY - rotationZ += other.rotationZ - scaleX *= other.scaleX - scaleY *= other.scaleY - scaleZ *= other.scaleZ - configure{ - update(other.meta) - } - } +internal fun Solid.updateFrom(other: Solid): Solid { + x += other.x + y += other.y + z += other.y + rotationX += other.rotationX + rotationY += other.rotationY + rotationZ += other.rotationZ + scaleX *= other.scaleX + scaleY *= other.scaleY + scaleZ *= other.scaleZ + setProperty(Name.EMPTY, other.getProperty(Name.EMPTY)) return this } @@ -34,17 +29,17 @@ internal fun Vision.updateFrom(other: Vision): Vision { internal object RemoveSingleChild : VisualTreeTransform() { override fun SolidGroup.transformInPlace() { - fun MutableVisionGroup.replaceChildren() { - children.forEach { (childName, parent) -> - if (parent is SolidReferenceGroup) return@forEach //ignore refs - if (parent is MutableVisionGroup) { + fun SolidGroup.replaceChildren() { + items.forEach { (childName, parent) -> + if (parent is SolidReference) return@forEach //ignore refs + if (parent is SolidGroup) { parent.replaceChildren() } - if (parent is VisionGroup && parent.children.size == 1) { - val child = parent.children.values.first() + if (parent is SolidGroup && parent.items.size == 1) { + val child: Solid = parent.items.values.first() val newParent = child.updateFrom(parent) newParent.parent = null - set(childName.asName(), newParent) + children[childName.asName()] = newParent } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt index 890c8291..b78863d2 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt @@ -2,41 +2,47 @@ package space.kscience.visionforge.solid.transform import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.visionforge.MutableVisionGroup -import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.SolidReferenceGroup +import space.kscience.visionforge.solid.SolidReference +import kotlin.collections.HashMap +import kotlin.collections.Map +import kotlin.collections.component1 +import kotlin.collections.component2 +import kotlin.collections.filter +import kotlin.collections.filterIsInstance +import kotlin.collections.fold +import kotlin.collections.forEach +import kotlin.collections.set @DFExperimental internal object UnRef : VisualTreeTransform() { - private fun VisionGroup.countRefs(): Map { - return children.values.fold(HashMap()) { reducer, obj -> - if (obj is VisionGroup) { - val counter = obj.countRefs() + private fun SolidGroup.countRefs(): Map { + return items.values.fold(HashMap()) { reducer, vision -> + if (vision is SolidGroup) { + val counter = vision.countRefs() counter.forEach { (key, value) -> reducer[key] = (reducer[key] ?: 0) + value } - } else if (obj is SolidReferenceGroup) { - reducer[obj.refName] = (reducer[obj.refName] ?: 0) + 1 + } else if (vision is SolidReference) { + reducer[vision.prototypeName] = (reducer[vision.prototypeName] ?: 0) + 1 } return reducer } } - private fun MutableVisionGroup.unref(name: Name) { + private fun SolidGroup.unref(name: Name) { (this as? SolidGroup)?.prototypes{ set(name, null) } - children.filter { (it.value as? SolidReferenceGroup)?.refName == name }.forEach { (key, value) -> - val reference = value as SolidReferenceGroup + items.filter { (it.value as? SolidReference)?.prototypeName == name }.forEach { (key, value) -> + val reference = value as SolidReference val newChild = reference.prototype.updateFrom(reference) newChild.parent = null - set(key.asName(), newChild) // replace proxy with merged object + children[key] = newChild // replace proxy with merged object } - children.values.filterIsInstance().forEach { it.unref(name) } + items.values.filterIsInstance().forEach { it.unref(name) } } override fun SolidGroup.transformInPlace() { diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt index 411aa75b..17dfb925 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt @@ -18,7 +18,7 @@ class CompositeTest { detail = 32 } material { - color("pink") + color.set("pink") } } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt index a7133006..500bddb2 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.getIndexed -import space.kscience.dataforge.meta.node import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.misc.DFExperimental import kotlin.test.Test @@ -12,7 +11,7 @@ class ConvexTest { @Suppress("UNUSED_VARIABLE") @Test fun testConvexBuilder() { - val group = SolidGroup().apply { + val group = SolidGroup{ convex { point(50, 50, -50) point(50, -50, -50) @@ -25,7 +24,7 @@ class ConvexTest { } } - val convex = group.children.values.first() as Convex + val convex = group.items.values.first() as Convex val json = Solids.jsonForSolids.encodeToJsonElement(Convex.serializer(), convex) val meta = json.toMeta() diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt index 4e78e340..87de5c77 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt @@ -9,7 +9,7 @@ import kotlin.test.assertEquals class GroupTest { @Test fun testGroupWithComposite() { - val group = SolidGroup().apply { + val group = SolidGroup{ union("union") { box(100, 100, 100) { z = 100 @@ -18,7 +18,7 @@ class GroupTest { } box(100, 100, 100) material { - color(Colors.lightgreen) + color.set(Colors.lightgreen) opacity = 0.3f } } @@ -30,7 +30,7 @@ class GroupTest { } box(100, 100, 100) y = 300 - color(Colors.red) + color.set(Colors.red) } subtract("subtract") { box(100, 100, 100) { @@ -40,12 +40,12 @@ class GroupTest { } box(100, 100, 100) y = -300 - color(Colors.blue) + color.set(Colors.blue) } } - assertEquals(3, group.children.count()) - assertEquals(300.0, (group["intersect"] as Solid).y.toDouble()) - assertEquals(-300.0, (group["subtract"] as Solid).y.toDouble()) + assertEquals(3, group.items.count()) + assertEquals(300.0, (group.children["intersect"] as Solid).y.toDouble()) + assertEquals(-300.0, (group.children["subtract"] as Solid).y.toDouble()) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index ec58e4d2..8e6f0b89 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -15,7 +15,7 @@ class PropertyTest { val box = Box(10.0f, 10.0f,10.0f) box.material { //meta["color"] = "pink" - color("pink") + color.set("pink") } assertEquals("pink", box.meta["material.color"]?.string) assertEquals("pink", box.color.string) @@ -33,7 +33,7 @@ class PropertyTest { } box.material { - color("pink") + color.set("pink") } assertEquals("pink", c) @@ -43,7 +43,7 @@ class PropertyTest { fun testInheritedProperty() { var box: Box? = null val group = SolidGroup().apply { - setPropertyNode("test", 22) + setPropertyValue("test", 22) group { box = box(100, 100, 100) } @@ -54,14 +54,14 @@ class PropertyTest { @Test fun testStyleProperty() { var box: Box? = null - val group = SolidGroup().apply { + val group = SolidGroup{ styleSheet { - set("testStyle") { + update("testStyle") { "test" put 22 } } group { - box = box(100, 100, 100).apply { + box = box(100, 100, 100) { useStyle("testStyle") } } @@ -74,7 +74,7 @@ class PropertyTest { var box: Box? = null val group = SolidGroup().apply { styleSheet { - set("testStyle") { + update("testStyle") { SolidMaterial.MATERIAL_COLOR_KEY put "#555555" } } @@ -89,10 +89,10 @@ class PropertyTest { @Test fun testReferenceStyleProperty() { - var box: SolidReferenceGroup? = null + var box: SolidReference? = null val group = SolidGroup{ styleSheet { - set("testStyle") { + update("testStyle") { SolidMaterial.MATERIAL_COLOR_KEY put "#555555" } } @@ -105,6 +105,6 @@ class PropertyTest { box = ref("box".asName()) } } - assertEquals("#555555", box?.color.string) + assertEquals("#555555", box!!.color.string) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 558d005c..70cb9c4e 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.MutableVisionGroup import space.kscience.visionforge.get import kotlin.test.Test import kotlin.test.assertEquals @@ -14,10 +13,10 @@ import kotlin.test.assertEquals fun SolidGroup.refGroup( name: String, templateName: Name = Name.parse(name), - block: MutableVisionGroup.() -> Unit -): SolidReferenceGroup { + block: SolidGroup.() -> Unit +): SolidReference { val group = SolidGroup().apply(block) - return newRef(name, group, templateName = templateName) + return newRef(name, group, prototypeName = templateName) } @@ -25,7 +24,7 @@ class SerializationTest { @Test fun testCubeSerialization() { val cube = Box(100f, 100f, 100f).apply { - color(222) + color.set(222) x = 100 z = -100 } @@ -38,7 +37,7 @@ class SerializationTest { @Test fun testProxySerialization() { val cube = Box(100f, 100f, 100f).apply { - color(222) + color.set(222) x = 100 z = -100 } @@ -53,21 +52,21 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group["cube"]?.meta, reconstructed["cube"]?.meta) + assertEquals(group.children["cube"]?.meta, reconstructed.children["cube"]?.meta) } @Test fun lightSerialization(){ val group = SolidGroup { ambientLight { - color(Colors.white) + color.set(Colors.white) intensity = 100.0 } } val serialized = Solids.encodeToString(group) val reconstructed = Solids.decodeFromString(serialized) as SolidGroup - assertEquals(100.0, (reconstructed["@ambientLight"] as AmbientLightSource).intensity.toDouble()) + assertEquals(100.0, (reconstructed.children["@ambientLight"] as AmbientLightSource).intensity.toDouble()) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt index 23a48a63..4ac22e1f 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt @@ -24,6 +24,9 @@ class SolidPluginTest { val reconstructed = visionManager.decodeFromMeta(meta) as SolidGroup - assertEquals(visionManager.encodeToJsonElement(vision["aBox"]!!), visionManager.encodeToJsonElement(reconstructed["aBox"]!!)) + assertEquals( + visionManager.encodeToJsonElement(vision.children["aBox"]!!), + visionManager.encodeToJsonElement(reconstructed.children["aBox"]!!) + ) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index cfdd73f0..4726f246 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -15,7 +15,7 @@ class SolidReferenceTest { SolidMaterial.MATERIAL_COLOR_KEY put "red" } newRef("test", Box(100f,100f,100f).apply { - color("blue") + color.set("blue") useStyle(theStyle) }) } @@ -23,13 +23,13 @@ class SolidReferenceTest { @Test fun testReferenceProperty(){ - assertEquals("blue", (groupWithReference["test"] as Solid).color.string) + assertEquals("blue", (groupWithReference.children["test"] as Solid).color.string) } @Test fun testReferenceSerialization(){ val serialized = Solids.jsonForSolids.encodeToJsonElement(groupWithReference) val deserialized = Solids.jsonForSolids.decodeFromJsonElement(SolidGroup.serializer(), serialized) - assertEquals("blue", (deserialized["test"] as Solid).color.string) + assertEquals("blue", (deserialized.children["test"] as Solid).color.string) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 26b4b40d..3fbf3ad4 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -21,24 +21,24 @@ class VisionUpdateTest { box(200,200,200, name = "origin") } val dif = VisionChange{ - group("top") { - color(123) + group ("top") { + color.set(123) box(100,100,100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } targetVision.update(dif) - assertTrue { targetVision["top"] is SolidGroup } - assertEquals("red", (targetVision["origin"] as Solid).color.string) // Should work - assertEquals("#00007b", (targetVision["top"] as Solid).color.string) // new item always takes precedence + assertTrue { targetVision.children["top"] is SolidGroup } + assertEquals("red", (targetVision.children["origin"] as Solid).color.string) // Should work + assertEquals("#00007b", (targetVision.children["top"] as Solid).color.string) // new item always takes precedence } @Test fun testVisionChangeSerialization(){ val change = VisionChange{ group("top") { - color(123) + color.set(123) box(100,100,100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index 6370b699..d76398fc 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -12,8 +12,9 @@ import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.tables.* -import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.html.VisionOutput +import space.kscience.visionforge.properties import kotlin.jvm.JvmName import kotlin.reflect.typeOf @@ -41,12 +42,13 @@ public val ColumnHeader.properties: ValueColumnScheme get() = ValueColumn @SerialName("vision.table") public class VisionOfTable( override val headers: List<@Serializable(ColumnHeaderSerializer::class) ColumnHeader>, -) : VisionBase(), Rows { +) : VisionGroup(), Rows { public var data: List get() = meta.getIndexed("rows").entries.sortedBy { it.key?.toInt() }.map { it.value } set(value) { - meta["rows"] = value + //TODO Make it better + properties()["rows"] = value } public val rows: List get() = data.map(::MetaRow) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 7ac4f13e..68b44fc5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -4,16 +4,15 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.geometries.EdgesGeometry import info.laht.threekt.objects.LineSegments import info.laht.threekt.objects.Mesh -import space.kscience.dataforge.meta.updateWith +import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.values.boolean import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.computePropertyNode +import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.setProperty +import space.kscience.visionforge.setPropertyValue import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.layer @@ -32,7 +31,7 @@ public abstract class MeshThreeFactory( */ public abstract fun buildGeometry(obj: T): BufferGeometry - override fun invoke(three: ThreePlugin, obj: T): Mesh { + override fun build(three: ThreePlugin, obj: T): Mesh { val geometry = buildGeometry(obj) //val meshMeta: Meta = obj.properties[Material3D.MATERIAL_KEY]?.node ?: Meta.empty @@ -78,8 +77,8 @@ public abstract class MeshThreeFactory( @VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { - setProperty(EDGES_ENABLED_KEY, enabled) - meta.getOrCreate(EDGES_MATERIAL_KEY).updateWith(SolidMaterial, block) + setPropertyValue(EDGES_ENABLED_KEY, enabled) + SolidMaterial.write(getProperty(EDGES_MATERIAL_KEY)).apply(block) } internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { @@ -95,9 +94,9 @@ internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { public fun Mesh.applyEdges(obj: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.getPropertyValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) { + if (obj.getProperty(EDGES_ENABLED_KEY, inherit = true).boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return - val material = ThreeMaterials.getLineMaterial(obj.computePropertyNode(EDGES_MATERIAL_KEY), true) + val material = ThreeMaterials.getLineMaterial(obj.getProperty(EDGES_MATERIAL_KEY), true) if (edges == null) { add( LineSegments( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt index c3d6bfa0..9e105bde 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -8,7 +8,7 @@ import kotlin.reflect.KClass public object ThreeAmbientLightFactory : ThreeFactory { override val type: KClass get() = AmbientLightSource::class - override fun invoke(three: ThreePlugin, obj: AmbientLightSource): AmbientLight { + override fun build(three: ThreePlugin, obj: AmbientLightSource): AmbientLight { val res = AmbientLight().apply { color = obj.color.threeColor() ?: Color(0x404040) intensity = obj.intensity.toDouble() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 7dd30a34..3fb87c7b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -11,6 +11,7 @@ import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.CanvasTextBaseline import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.MIDDLE +import space.kscience.visionforge.getProperty import space.kscience.visionforge.solid.SolidLabel import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG @@ -22,11 +23,11 @@ import kotlin.reflect.KClass public object ThreeCanvasLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun invoke(three: ThreePlugin, obj: SolidLabel): Object3D { + override fun build(three: ThreePlugin, obj: SolidLabel): Object3D { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.getPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" + context.fillStyle = obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 74528c50..4bd9826c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -37,7 +37,7 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class - override fun invoke(three: ThreePlugin, obj: Composite): Mesh { + override fun build(three: ThreePlugin, obj: Composite): Mesh { val first = three.buildObject3D(obj.first).takeIfMesh() ?: error("First part of composite is not a mesh") val second = three.buildObject3D(obj.second).takeIfMesh() ?: error("Second part of composite is not a mesh") return when (obj.compositeType) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 6e540f71..3397ea96 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -22,7 +22,7 @@ public interface ThreeFactory { public val type: KClass - public operator fun invoke(three: ThreePlugin, obj: T): Object3D + public fun build(three: ThreePlugin, obj: T): Object3D public companion object { public const val TYPE: String = "threeFactory" diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index d07f542e..46df4405 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -17,7 +17,7 @@ import kotlin.reflect.KClass public object ThreeLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun invoke(three: ThreePlugin, obj: SolidLabel): Object3D { + override fun build(three: ThreePlugin, obj: SolidLabel): Object3D { val textGeo = TextBufferGeometry(obj.text, jso { font = obj.fontFamily size = 20 diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index ee36d74b..da1984f3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,7 +4,7 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments -import space.kscience.visionforge.computePropertyNode +import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial @@ -17,7 +17,7 @@ import kotlin.reflect.KClass public object ThreeLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override fun invoke(three: ThreePlugin, obj: PolyLine): Object3D { + override fun build(three: ThreePlugin, obj: PolyLine): Object3D { val geometry = BufferGeometry().apply { setFromPoints(Array((obj.points.size - 1) * 2) { obj.points[ceil(it / 2.0).toInt()].toVector() @@ -25,7 +25,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - obj.computePropertyNode(SolidMaterial.MATERIAL_KEY), + obj.getProperty(SolidMaterial.MATERIAL_KEY), false ) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 82b088e5..e0f3a4a6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -171,7 +171,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { ?: ThreeMaterials.BLACK_COLOR } SolidMaterial.MATERIAL_OPACITY_KEY -> { - val opacity = vision.getPropertyValue( + val opacity = vision.getProperty( SolidMaterial.MATERIAL_OPACITY_KEY, inherit = true, )?.double ?: 1.0 @@ -179,7 +179,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { material.transparent = opacity < 1.0 } SolidMaterial.MATERIAL_WIREFRAME_KEY -> { - material.asDynamic().wireframe = vision.getPropertyValue( + material.asDynamic().wireframe = vision.getProperty( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, )?.boolean ?: false diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 182ec009..03ed5ee4 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -12,7 +12,6 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.set import space.kscience.visionforge.visible import kotlin.collections.set import kotlin.reflect.KClass @@ -49,10 +48,10 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public fun buildObject3D(obj: Solid): Object3D = when (obj) { is ThreeJsVision -> obj.render(this) - is SolidReferenceGroup -> ThreeReferenceFactory(this, obj) + is SolidReferenceGroup -> ThreeReferenceFactory.build(this, obj) is SolidGroup -> { val group = ThreeGroup() - obj.children.forEach { (token, child) -> + obj.items.forEach { (token, child) -> if (child is Solid && token != SolidGroup.PROTOTYPES_TOKEN && child.ignore != true) { try { val object3D = buildObject3D(child) @@ -101,13 +100,13 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } } } - is Composite -> compositeFactory(this, obj) + is Composite -> compositeFactory.build(this, obj) else -> { //find specialized factory for this type if it is present val factory: ThreeFactory? = findObjectFactory(obj::class) when { - factory != null -> factory(this, obj) - obj is GeometrySolid -> ThreeShapeFactory(this, obj) + factory != null -> factory.build(this, obj) + obj is GeometrySolid -> ThreeShapeFactory.build(this, obj) else -> error("Renderer for ${obj::class} not found") } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt index 727aa098..e6c84c94 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -11,17 +11,19 @@ import kotlin.reflect.KClass public object ThreePointLightFactory : ThreeFactory { override val type: KClass get() = PointLightSource::class - override fun invoke(three: ThreePlugin, obj: PointLightSource): PointLight { + private val DEFAULT_COLOR = Color(0x404040) + + override fun build(three: ThreePlugin, obj: PointLightSource): PointLight { val res = PointLight().apply { matrixAutoUpdate = false - color = obj.color.threeColor() ?: Color(0x404040) + color = obj.color.threeColor() ?: DEFAULT_COLOR intensity = obj.intensity.toDouble() updatePosition(obj) } obj.onPropertyChange { name -> when (name) { - LightSource::color.name.asName() -> res.color = obj.color.threeColor() ?: Color(0x404040) + LightSource::color.name.asName() -> res.color = obj.color.threeColor() ?: DEFAULT_COLOR LightSource::intensity.name.asName() -> res.intensity = obj.intensity.toDouble() else -> res.updateProperty(obj, name) } @@ -29,4 +31,5 @@ public object ThreePointLightFactory : ThreeFactory { return res } + } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index aa779e46..8e667dcb 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -30,7 +30,7 @@ public object ThreeReferenceFactory : ThreeFactory { } } - override fun invoke(three: ThreePlugin, obj: SolidReferenceGroup): Object3D { + override fun build(three: ThreePlugin, obj: SolidReferenceGroup): Object3D { val template = obj.prototype val cachedObject = cache.getOrPut(template) { three.buildObject3D(template) @@ -50,7 +50,7 @@ public object ThreeReferenceFactory : ThreeFactory { if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() - val referenceChild = obj[childName] ?: error("Reference child with name '$childName' not found") + val referenceChild = obj.children[childName] ?: error("Reference child with name '$childName' not found") val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") child.updateProperty(referenceChild, propertyName) } else { -- 2.34.1 From 9b1ca8332b4825b35d66752ac3cdac708bca6958 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 7 Aug 2022 20:33:05 +0300 Subject: [PATCH 077/143] [WIP] great refactoring in progress --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 3 +- .../visionforge/gdml/GDMLVisionTest.kt | 1 - .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 4 +- .../visionforge/solid/demo/VariableBox.kt | 2 +- .../kscience/visionforge/AbstractVision.kt | 144 ++++++------ .../space/kscience/visionforge/StyleSheet.kt | 18 +- .../space/kscience/visionforge/Vision.kt | 157 +------------ .../kscience/visionforge/VisionChange.kt | 12 +- .../kscience/visionforge/VisionContainer.kt | 30 +-- .../space/kscience/visionforge/VisionGroup.kt | 47 +++- .../kscience/visionforge/VisionManager.kt | 8 +- .../kscience/visionforge/VisionProperties.kt | 208 +++++++++++++++--- .../visionforge/VisionPropertyContainer.kt | 29 --- .../visionforge/html/VisionOfHtmlForm.kt | 3 +- .../visionforge/html/VisionOfHtmlInput.kt | 19 +- .../kscience/visionforge/visionDelegates.kt | 91 -------- .../visionforge/visitor/VisionVisitor.kt | 5 +- .../kscience/visionforge/html/HtmlTagTest.kt | 11 +- .../visionforge/meta/VisionPropertyTest.kt | 48 ++-- .../editor/VisionEditorFragment.kt | 1 - .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +- .../solid/VisualObjectFXBinding.kt | 1 - .../kscience/visionforge/gdml/markLayers.kt | 2 +- .../visionforge/plotly/VisionOfPlotly.kt | 5 +- .../visionforge/solid/ColorAccessor.kt | 4 +- .../kscience/visionforge/solid/Composite.kt | 15 +- .../kscience/visionforge/solid/ConeSegment.kt | 8 +- .../kscience/visionforge/solid/ConeSurface.kt | 9 +- .../kscience/visionforge/solid/Convex.kt | 11 +- .../kscience/visionforge/solid/Extruded.kt | 13 +- .../kscience/visionforge/solid/Hexagon.kt | 10 +- .../kscience/visionforge/solid/LightSource.kt | 9 +- .../kscience/visionforge/solid/PolyLine.kt | 16 +- .../space/kscience/visionforge/solid/Solid.kt | 30 +-- .../kscience/visionforge/solid/SolidBase.kt | 15 +- .../kscience/visionforge/solid/SolidGroup.kt | 10 +- .../kscience/visionforge/solid/SolidLabel.kt | 7 +- .../visionforge/solid/SolidMaterial.kt | 12 +- .../visionforge/solid/SolidReference.kt | 196 ++++++++++------- .../kscience/visionforge/solid/Solids.kt | 5 +- .../kscience/visionforge/solid/Sphere.kt | 9 +- .../kscience/visionforge/solid/SphereLayer.kt | 6 +- .../solid/transform/RemoveSingleChild.kt | 4 +- .../visionforge/solid/PropertyTest.kt | 11 +- .../visionforge/solid/SerializationTest.kt | 4 +- .../visionforge/tables/VisionOfTable.kt | 10 +- .../solid/three/MeshThreeFactory.kt | 1 - .../solid/three/ThreeCanvasLabelFactory.kt | 3 +- .../solid/three/ThreeLineFactory.kt | 3 +- 49 files changed, 601 insertions(+), 672 deletions(-) delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index fbeb84dd..8cc4c258 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -3,7 +3,6 @@ package ru.mipt.npm.root import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.doubleArray @@ -322,7 +321,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? } return if (group.children.isEmpty()) { null - } else if (group.items.size == 1 && group.meta.isEmpty()) { + } else if (group.items.size == 1 && group.meta== null) { group.items.values.first().apply { parent = null } } else { group diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index afb23f16..c46f49ff 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -6,7 +6,6 @@ import space.kscience.dataforge.values.asValue import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Vision import space.kscience.visionforge.get -import space.kscience.visionforge.getProperty import space.kscience.visionforge.getPropertyValue import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 596b11dd..dff6da3f 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -3,7 +3,7 @@ package ru.mipt.npm.muon.monitor import ru.mipt.npm.muon.monitor.Monitor.CENTRAL_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.LOWER_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.UPPER_LAYER_Z -import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionManager import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.* @@ -14,7 +14,7 @@ class Model(val manager: VisionManager) { private val map = HashMap() private val events = HashSet() - private fun VisionContainerBuilder.pixel(pixel: SC1) { + private fun MutableVisionContainer.pixel(pixel: SC1) { val group = group(pixel.name) { position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z) box(pixel.xSize, pixel.ySize, pixel.zSize) diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 84a164c8..d429cafb 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -49,7 +49,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision onPropertyChange { name -> when { name == VALUE -> { - val value = meta.get(VALUE).int ?: 0 + val value = meta[VALUE].int ?: 0 val size = value.toFloat() / 255f * 20f mesh.scale.z = size.toDouble() mesh.position.z = size.toDouble() / 2 diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt index c6cba1ba..f6b38880 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt @@ -3,101 +3,105 @@ package space.kscience.visionforge import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch -import kotlinx.serialization.Serializable +import kotlinx.serialization.SerialName import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.asMutableMeta +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.values.Value -import space.kscience.visionforge.VisionGroup.Companion.updateProperties +import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import kotlin.jvm.Synchronized -@Serializable + public abstract class AbstractVision : Vision { @Transient override var parent: Vision? = null - protected var properties: MutableMeta? = null + @SerialName("properties") + internal var _properties: MutableMeta? = null - override val meta: Meta get() = properties ?: Meta.EMPTY - - @Synchronized - private fun getOrCreateProperties(): MutableMeta { - if (properties == null) { - //TODO check performance issues - val newProperties = MutableMeta() - properties = newProperties - } - return properties!! - } + protected open val defaultProperties: Meta? get() = descriptor?.defaultNode @Transient - private val _propertyChanges = MutableSharedFlow() - override val propertyChanges: SharedFlow get() = _propertyChanges + final override val properties: MutableVisionProperties = object : MutableVisionProperties { + override val descriptor: MetaDescriptor? get() = this@AbstractVision.descriptor + override val default: Meta? get() = defaultProperties - override fun getPropertyValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Value? { - properties?.get(name)?.value?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.value?.let { return it } + @Synchronized + private fun getOrCreateProperties(): MutableMeta { + if (_properties == null) { + //TODO check performance issues + val newProperties = MutableMeta() + _properties = newProperties + } + return _properties!! } - if (inherit) { - parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } - } - if (includeDefaults) { - descriptor?.defaultNode?.get(name)?.value?.let { return it } - } - return null - } - override fun setProperty(name: Name, node: Meta?) { - //TODO check old value? - if (name.isEmpty()) { - properties = node?.asMutableMeta() - } else if (node == null) { - properties?.setMeta(name, node) - } else { - getOrCreateProperties().setMeta(name, node) - } - invalidateProperty(name) - } + override val raw: Meta? get() = _properties - override fun setPropertyValue(name: Name, value: Value?) { - //TODO check old value? - if (value == null) { - properties?.getMeta(name)?.value = null - } else { - getOrCreateProperties().setValue(name, value) + override fun getValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): Value? { + raw?.get(name)?.value?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.value?.let { return it } + } + if (inherit) { + parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } + } + return default?.get(name)?.value } - invalidateProperty(name) + + override fun set(name: Name, node: Meta?) { + //TODO check old value? + if (name.isEmpty()) { + _properties = node?.asMutableMeta() + } else if (node == null) { + _properties?.setMeta(name, node) + } else { + getOrCreateProperties().setMeta(name, node) + } + invalidate(name) + } + + override fun setValue(name: Name, value: Value?) { + //TODO check old value? + if (value == null) { + _properties?.getMeta(name)?.value = null + } else { + getOrCreateProperties().setValue(name, value) + } + invalidate(name) + } + + @Transient + private val _changes = MutableSharedFlow() + override val changes: SharedFlow get() = _changes + + override fun invalidate(propertyName: Name) { + if (propertyName == Vision.STYLE_KEY) { + styles.asSequence() + .mapNotNull { getStyle(it) } + .flatMap { it.items.asSequence() } + .distinctBy { it.key } + .forEach { + invalidate(it.key.asName()) + } + } + manager.context.launch { + _changes.emit(propertyName) + } + } + } override val descriptor: MetaDescriptor? get() = null - override fun invalidateProperty(propertyName: Name) { - if (propertyName == Vision.STYLE_KEY) { - styles.asSequence() - .mapNotNull { getStyle(it) } - .flatMap { it.items.asSequence() } - .distinctBy { it.key } - .forEach { - invalidateProperty(it.key.asName()) - } - } - manager.context.launch { - _propertyChanges.emit(propertyName) - } - } override fun update(change: VisionChange) { change.properties?.let { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index cc465d87..aed19706 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -15,7 +15,7 @@ import kotlin.jvm.JvmInline @JvmInline public value class StyleSheet(private val owner: Vision) { - private val styleNode: Meta get() = owner.getProperty(STYLESHEET_KEY) + private val styleNode: Meta get() = owner.properties[STYLESHEET_KEY] public val items: Map get() = styleNode.items @@ -25,7 +25,7 @@ public value class StyleSheet(private val owner: Vision) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.setProperty(STYLESHEET_KEY + key, style) + owner.properties[STYLESHEET_KEY + key] = style } /** @@ -58,26 +58,24 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) val tokens: Collection = ((oldStyle?.items?.keys ?: emptySet()) + (newStyle?.items?.keys ?: emptySet())) .map { it.asName() } - tokens.forEach { parent?.invalidateProperty(it) } + tokens.forEach { parent?.properties?.invalidate(it) } } - children.values.forEach { vision -> + children?.forEach { _, vision -> vision.styleChanged(key, oldStyle, newStyle) } } - /** * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = getPropertyValue( + get() = properties.getValue( Vision.STYLE_KEY, inherit = true, includeStyles = false, - includeDefaults = false )?.stringList ?: emptyList() set(value) { - setPropertyValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) + properties.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } /** @@ -90,7 +88,7 @@ public val Vision.styleSheet: StyleSheet get() = StyleSheet(this) * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String) { - styles = (getPropertyValue(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name + styles = (properties.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name } @@ -98,7 +96,7 @@ public fun Vision.useStyle(name: String) { * Resolve a style with given name for given [Vision]. The style is not necessarily applied to this [Vision]. */ public fun Vision.getStyle(name: String): Meta? = - meta.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + properties.raw?.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) /** * Resolve a property from all styles diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index b25f200c..e538b226 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -1,22 +1,15 @@ package space.kscience.visionforge import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import space.kscience.dataforge.context.Global -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.MutableMetaProvider import space.kscience.dataforge.meta.descriptors.Described import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.boolean import space.kscience.visionforge.Vision.Companion.TYPE @@ -38,49 +31,8 @@ public interface Vision : Described { */ public val manager: VisionManager get() = parent?.manager ?: Global.visionManager - public val children: VisionChildren - /** - * Own properties without inheritance or styles. - */ - public val meta: Meta - - public fun getPropertyValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Value? - - /** - * Get property with given layer flags. - * @param inherit toggles parent node property lookup. Null means inference from descriptor. - * @param includeStyles toggles inclusion of properties from styles. - */ - public fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): MutableMeta = VisionProperties(this, name, descriptor?.get(name), inherit, includeStyles) - - public fun setProperty( - name: Name, - node: Meta?, - ) - - public fun setPropertyValue( - name: Name, - value: Value?, - ) - - public val propertyChanges: SharedFlow - - /** - * Notify all listeners that a property has been changed and should be invalidated. - * This method does not check that the property has actually changed. - */ - public fun invalidateProperty(propertyName: Name) + public val properties: MutableVisionProperties /** * Update this vision using a dif represented by [VisionChange]. @@ -98,108 +50,19 @@ public interface Vision : Described { } } -public fun Vision.getPropertyValue( - name: Name, - inherit: Boolean? = null, - includeStyles: Boolean? = null, - includeDefaults: Boolean = true, - metaDescriptor: MetaDescriptor? = descriptor?.get(name), -): Value? { - val inheritFlag = inherit ?: metaDescriptor?.inherited ?: false - val stylesFlag = includeStyles ?: metaDescriptor?.usesStyles ?: true - return getPropertyValue(name, inheritFlag, stylesFlag, includeDefaults) -} - -public fun Vision.getPropertyValue( - name: String, - inherit: Boolean? = null, - includeStyles: Boolean? = null, - includeDefaults: Boolean = true, - metaDescriptor: MetaDescriptor? = descriptor?.get(name), -): Value? = getPropertyValue(name.parseAsName(), inherit, includeStyles, includeDefaults, metaDescriptor) - -/** - * Compute the property based on the provided value descriptor. By default, use Vision own descriptor - */ -public fun Vision.getProperty( - name: Name, - inherit: Boolean? = null, - includeStyles: Boolean? = null, - includeDefaults: Boolean = true, - metaDescriptor: MetaDescriptor? = descriptor?.get(name), -): MutableMeta { - val inheritFlag = inherit ?: metaDescriptor?.inherited ?: false - val stylesFlag = includeStyles ?: metaDescriptor?.usesStyles ?: true - return getProperty(name, inheritFlag, stylesFlag, includeDefaults) -} - - -/** - * Get [Vision] property using key as a String - */ -public fun Vision.getProperty( - name: String, - inherit: Boolean? = null, - includeStyles: Boolean? = null, - includeDefaults: Boolean = true, - metaDescriptor: MetaDescriptor? = descriptor?.get(name), -): MutableMeta = getProperty(name.parseAsName(), inherit, includeStyles, includeDefaults, metaDescriptor) - - -/** - * Vision's own non-inheritable, non-styleable properties - */ -public fun Vision.properties( - inherit: Boolean? = null, - useStyles: Boolean? = null, -): MutableMetaProvider = VisionProperties(this, Name.EMPTY, inherit = inherit, useStyles = useStyles) - -public fun Vision.setPropertyValue(name: Name, value: Number?) { - if (value == null) { - setPropertyValue(name, null) - } else { - setPropertyValue(name, value.asValue()) - } -} - -public fun Vision.setPropertyValue(name: String, value: Number?): Unit = - setPropertyValue(name.parseAsName(), value) - -public fun Vision.setPropertyValue(name: Name, value: Boolean?) { - if (value == null) { - setPropertyValue(name, null) - } else { - setPropertyValue(name, value.asValue()) - } -} - -public fun Vision.setPropertyValue(name: String, value: Boolean?): Unit = - setPropertyValue(name.parseAsName(), value) - -public fun Vision.setPropertyValue(name: Name, value: String?) { - if (value == null) { - setPropertyValue(name, null) - } else { - setPropertyValue(name, value.asValue()) - } -} - -public fun Vision.setPropertyValue(name: String, value: String?): Unit = - setPropertyValue(name.parseAsName(), value) - /** * Control visibility of the element */ public var Vision.visible: Boolean? - get() = getPropertyValue(Vision.VISIBLE_KEY)?.boolean + get() = properties.getValue(Vision.VISIBLE_KEY)?.boolean set(value) { - setPropertyValue(Vision.VISIBLE_KEY, value) + properties.setValue(Vision.VISIBLE_KEY, value?.asValue()) } /** * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled */ -public fun Vision.onPropertyChange(callback: (Name) -> Unit): Job = propertyChanges.onEach { +public fun Vision.onPropertyChange(callback: (Name) -> Unit): Job = properties.changes.onEach { callback(it) }.launchIn(manager.context) @@ -210,17 +73,9 @@ public fun V.useProperty( ): Job { //Pass initial value. callBack(property.get(this)) - return propertyChanges.onEach { name -> + return properties.changes.onEach { name -> if (name.startsWith(property.name.asName())) { callBack(property.get(this@useProperty)) } }.launchIn(manager.context) -} - - -public interface MutableVisionGroup : Vision { - - override val children: MutableVisionChildren - - public fun createGroup(): MutableVisionGroup -} +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index abea638a..a4667b2f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -26,7 +26,7 @@ private fun Vision.deepCopy(): Vision { /** * An update for a [Vision] */ -public class VisionChangeBuilder : VisionContainerBuilder { +public class VisionChangeBuilder : MutableVisionContainer { private var reset: Boolean = false private var vision: Vision? = null @@ -77,7 +77,7 @@ public class VisionChangeBuilder : VisionContainerBuilder { public data class VisionChange( public val delete: Boolean = false, public val vision: Vision? = null, - @Serializable(MetaSerializer::class) public val properties: Meta? = null, + public val properties: Meta? = null, public val children: Map? = null, ) @@ -93,25 +93,25 @@ private fun CoroutineScope.collectChange( //Collect properties change source.onPropertyChange { propertyName -> - val newItem = source.getProperty(propertyName, false, false, false) + val newItem = source.properties.raw?.get(propertyName) collector().propertyChanged(name, propertyName, newItem) } val children = source.children //Subscribe for children changes - for ((token, child) in children) { + children?.forEach { token, child -> collectChange(name + token, child, collector) } //Subscribe for structure change - children.changes.onEach { changedName -> + children?.changes?.onEach { changedName -> val after = children[changedName] val fullName = name + changedName if (after != null) { collectChange(fullName, after, collector) } collector()[fullName] = after - }.launchIn(this) + }?.launchIn(this) } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index f7056d59..81f7d9da 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -19,7 +19,7 @@ public interface VisionContainer { public operator fun get(name: Name): V? } -public interface VisionContainerBuilder { +public interface MutableVisionContainer { //TODO add documentation public operator fun set(name: Name?, child: V?) } @@ -28,7 +28,7 @@ public interface VisionContainerBuilder { * A serializable representation of [Vision] children container */ public interface VisionChildren : VisionContainer { - public val parent: Vision? + public val group: Vision? public val keys: Set @@ -39,14 +39,14 @@ public interface VisionChildren : VisionContainer { public operator fun get(token: NameToken): Vision? override fun get(name: Name): Vision? = when (name.length) { - 0 -> parent + 0 -> group 1 -> get(name.first()) else -> get(name.first())?.children?.get(name.cutFirst()) } public companion object { public fun empty(owner: Vision): VisionChildren = object : VisionChildren { - override val parent: Vision get() = owner + override val group: Vision get() = owner override val keys: Set get() = emptySet() override val changes: Flow get() = emptyFlow() override fun get(token: NameToken): Vision? = null @@ -56,9 +56,13 @@ public interface VisionChildren : VisionContainer { public fun VisionChildren.isEmpty(): Boolean = keys.isEmpty() +public inline fun VisionChildren.forEach(block: (NameToken, Vision) -> Unit) { + keys.forEach { block(it, get(it)!!) } +} + @Serializable(VisionChildrenContainerSerializer::class) -public interface MutableVisionChildren : VisionChildren, VisionContainerBuilder { - public override val parent: MutableVisionGroup? +public interface MutableVisionChildren : VisionChildren, MutableVisionContainer { + public override val group: MutableVisionGroup? public operator fun set(token: NameToken, value: Vision?) @@ -79,7 +83,7 @@ public interface MutableVisionChildren : VisionChildren, VisionContainerBuilder< else -> { val currentParent = get(name.first()) if (currentParent != null && currentParent !is MutableVisionGroup) error("Can't assign a child to $currentParent") - val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: parent?.createGroup().also { + val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: group?.createGroup().also { set(name.first(), it) } ?: error("Container owner not set") parent.children[name.cutFirst()] = child @@ -105,7 +109,7 @@ public operator fun VisionChildren.iterator(): Iterator> public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) -public operator fun VisionContainerBuilder.set( +public operator fun MutableVisionContainer.set( str: String?, vision: V?, ): Unit = set(str?.parseAsName(), vision) @@ -113,13 +117,13 @@ internal class VisionChildrenImpl( items: Map, ) : MutableVisionChildren { - override var parent: MutableVisionGroup? = null + override var group: MutableVisionGroup? = null internal set private val items = LinkedHashMap(items) private val updateJobs = HashMap() - private val scope: CoroutineScope? get() = parent?.manager?.context + private val scope: CoroutineScope? get() = group?.manager?.context override val keys: Set get() = items.keys @@ -149,9 +153,9 @@ internal class VisionChildrenImpl( } else { items[token] = value //check if parent already exists and is different from the current one - if (value.parent != null && value.parent != parent) error("Can't reassign parent Vision for $value") + if (value.parent != null && value.parent != group) error("Can't reassign parent Vision for $value") //set parent - value.parent = parent + value.parent = group //start update jobs (only if the vision is rooted) scope?.let { scope -> val job = (value.children as? VisionChildrenImpl)?.changes?.onEach { @@ -179,7 +183,7 @@ internal class VisionChildrenImpl( } internal object VisionChildrenContainerSerializer : KSerializer { - private val mapSerializer = serializer>() + private val mapSerializer = serializer>() override val descriptor: SerialDescriptor = mapSerializer.descriptor diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 3c843b85..f87650a7 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -13,20 +13,33 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY +import kotlin.js.JsName import kotlin.jvm.Synchronized + +public interface VisionGroup : Vision { + public val children: VisionChildren +} + +public interface MutableVisionGroup : VisionGroup { + + override val children: MutableVisionChildren + + public fun createGroup(): MutableVisionGroup +} + +public val Vision.children: VisionChildren? get() = (this as? VisionGroup)?.children + /** * A full base implementation for a [Vision] */ -@Serializable -@SerialName("vision.group") -public open class VisionGroup : AbstractVision(), MutableVisionGroup { +public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup { override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { - change.delete -> children.set(name, null) - change.vision != null -> children.set(name, change.vision) + change.delete -> children[name] = null + change.vision != null -> children[name] = change.vision else -> children[name]?.update(change) } } @@ -45,13 +58,13 @@ public open class VisionGroup : AbstractVision(), MutableVisionGroup { fun getOrCreateChildren(): MutableVisionChildren { if (_children == null) { _children = VisionChildrenImpl(emptyMap()).apply { - parent = this@VisionGroup + group = this@AbstractVisionGroup } } return _children!! } - override val parent: MutableVisionGroup get() = this@VisionGroup + override val group: MutableVisionGroup get() = this@AbstractVisionGroup override val keys: Set get() = _children?.keys ?: emptySet() override val changes: Flow get() = _children?.changes ?: emptyFlow() @@ -71,7 +84,7 @@ public open class VisionGroup : AbstractVision(), MutableVisionGroup { } } - override fun createGroup(): VisionGroup = VisionGroup() + abstract override fun createGroup(): AbstractVisionGroup public companion object { public val descriptor: MetaDescriptor = MetaDescriptor { @@ -80,16 +93,28 @@ public open class VisionGroup : AbstractVision(), MutableVisionGroup { } } - public fun Vision.updateProperties(item: Meta, at: Name = Name.EMPTY) { - setPropertyValue(at, item.value) + public fun Vision.updateProperties(item: Meta, name: Name = Name.EMPTY) { + properties.setValue(name, item.value) item.items.forEach { (token, item) -> - updateProperties(item, at + token) + updateProperties(item, name + token) } } } } +/** + * A simple vision group that just holds children. Nothing else. + */ +@Serializable +@SerialName("vision.group") +public class SimpleVisionGroup : AbstractVisionGroup() { + override fun createGroup(): SimpleVisionGroup = SimpleVisionGroup() +} + +@JsName("createVisionGroup") +public fun VisionGroup(): VisionGroup = SimpleVisionGroup() + //fun VisualObject.findStyle(styleName: Name): Meta? { // if (this is VisualGroup) { // val style = resolveStyle(styleName) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index a11ad358..3428dd33 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -68,8 +68,8 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { private val defaultSerialModule: SerializersModule = SerializersModule { polymorphic(Vision::class) { - default { VisionGroup.serializer() } - subclass(VisionGroup.serializer()) + default { SimpleVisionGroup.serializer() } + subclass(SimpleVisionGroup.serializer()) subclass(VisionOfNumberField.serializer()) subclass(VisionOfTextField.serializer()) subclass(VisionOfCheckbox.serializer()) @@ -112,7 +112,9 @@ public fun Vision.encodeToString(): String = manager.encodeToString(this) /** * A root vision attached to [VisionManager] */ -public class RootVision(override val manager: VisionManager) : VisionGroup() +public class RootVision(override val manager: VisionManager) : AbstractVisionGroup() { + override fun createGroup(): SimpleVisionGroup = SimpleVisionGroup() +} /** * Designate this [Vision] as a root and assign a [VisionManager] as its parent diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 140170d3..b4ca16ec 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,40 +1,104 @@ package space.kscience.visionforge +import kotlinx.coroutines.flow.Flow import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue -/** - * A wrapper that emulates delegates reading and writing properties to Vision method - */ -internal class VisionProperties( - val vision: Vision, +public interface VisionProperties { + + /** + * Raw Visions own properties without styles, defaults, etc. + */ + public val raw: Meta? + + public val descriptor: MetaDescriptor? + public val default: Meta? + + public fun getValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): Value? + + /** + * Get property with given layer flags. + * @param inherit toggles parent node property lookup. Null means inference from descriptor. + * @param includeStyles toggles inclusion of properties from styles. + */ + public operator fun get( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): Meta + + public val changes: Flow + + /** + * Notify all listeners that a property has been changed and should be invalidated. + * This method does not check that the property has actually changed. + */ + public fun invalidate(propertyName: Name) +} + +public interface MutableVisionProperties : VisionProperties { + + override operator fun get( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): MutableMeta = VisionPropertiesItem( + this, + name, + inherit, + includeStyles, + ) + + + public operator fun set( + name: Name, + node: Meta?, + ) + + public fun setValue( + name: Name, + value: Value?, + ) +} + +private class VisionPropertiesItem( + val properties: MutableVisionProperties, val nodeName: Name, - val visionDescriptor: MetaDescriptor? = vision.descriptor, val inherit: Boolean? = null, val useStyles: Boolean? = null, + val default: Meta? = null, ) : MutableMeta { - val descriptor: MetaDescriptor? by lazy { visionDescriptor?.get(nodeName) } + val descriptor: MetaDescriptor? by lazy { properties.descriptor?.get(nodeName) } + override val items: Map get() { - val metaKeys = vision.meta.getMeta(nodeName)?.items?.keys ?: emptySet() + val metaKeys = properties.raw?.getMeta(nodeName)?.items?.keys ?: emptySet() val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() + val defaultKeys = default?.get(nodeName)?.items?.keys ?: emptySet() val inheritFlag = descriptor?.inherited ?: inherit val stylesFlag = descriptor?.usesStyles ?: useStyles - return (metaKeys + descriptorKeys).associateWith { - VisionProperties( - vision, + return (metaKeys + descriptorKeys + defaultKeys).associateWith { + VisionPropertiesItem( + properties, nodeName + it, - visionDescriptor, inheritFlag, - stylesFlag + stylesFlag, + default ) } } @@ -43,22 +107,22 @@ internal class VisionProperties( get() { val inheritFlag = descriptor?.inherited ?: inherit ?: false val stylesFlag = descriptor?.usesStyles ?: useStyles ?: true - return vision.getPropertyValue(nodeName, inheritFlag, stylesFlag, true) + return properties.getValue(nodeName, inheritFlag, stylesFlag) ?: default?.getValue(nodeName) } set(value) { - vision.setPropertyValue(nodeName, value) + properties.setValue(nodeName, value) } - override fun getOrCreate(name: Name): MutableMeta = VisionProperties( - vision, + override fun getOrCreate(name: Name): MutableMeta = VisionPropertiesItem( + properties, nodeName + name, - visionDescriptor, inherit, - useStyles + useStyles, + default ) override fun setMeta(name: Name, node: Meta?) { - vision.setProperty(nodeName + name, node) + properties[nodeName + name] = node } override fun toString(): String = Meta.toString(this) @@ -66,16 +130,96 @@ internal class VisionProperties( override fun hashCode(): Int = Meta.hashCode(this) } -///** -// * Accessor to all vision properties -// */ -//public fun Vision.computePropertyValues( -// descriptor: MetaDescriptor? = this.descriptor, -//): MutableValueProvider = object : MutableValueProvider { -// override fun getValue(name: Name): Value? = computeProperty(name, descriptor?.get(name))?.value -// -// override fun setValue(name: Name, value: Value?) { -// setProperty(name, value) -// } -//} +public fun VisionProperties.getValue( + name: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Value? { + val descriptor = descriptor?.get(name) + val inheritFlag = inherit ?: descriptor?.inherited ?: false + val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true + return getValue(name, inheritFlag, stylesFlag) +} + +public fun VisionProperties.getValue( + name: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Value? = getValue(name.parseAsName(), inherit, includeStyles) + +/** + * Compute the property based on the provided value descriptor. By default, use Vision own descriptor + */ +public operator fun VisionProperties.get( + name: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Meta { + val descriptor: MetaDescriptor? = descriptor?.get(name) + val inheritFlag = inherit ?: descriptor?.inherited ?: false + val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true + return get(name, inheritFlag, stylesFlag) +} + + +/** + * Get [Vision] property using key as a String + */ +public operator fun VisionProperties.get( + name: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Meta = get(name.parseAsName(), inherit, includeStyles) + + +/** + * Compute the property based on the provided value descriptor. By default, use Vision own descriptor + */ +public operator fun MutableVisionProperties.get( + name: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): MutableMeta { + val descriptor: MetaDescriptor? = descriptor?.get(name) + val inheritFlag = inherit ?: descriptor?.inherited ?: false + val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true + return get(name, inheritFlag, stylesFlag) +} + +/** + * The root property node with given inheritance and style flags + */ +public fun MutableVisionProperties.root( + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): MutableMeta = get(Name.EMPTY, inherit, includeStyles) + + +/** + * Get [Vision] property using key as a String + */ +public operator fun MutableVisionProperties.get( + name: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): MutableMeta = get(name.parseAsName(), inherit, includeStyles) + + +public operator fun MutableVisionProperties.set(name: Name, value: Number): Unit = + setValue(name, value.asValue()) + +public operator fun MutableVisionProperties.set(name: String, value: Number): Unit = + set(name.parseAsName(), value) + +public operator fun MutableVisionProperties.set(name: Name, value: Boolean): Unit = + setValue(name, value.asValue()) + +public operator fun MutableVisionProperties.set(name: String, value: Boolean): Unit = + set(name.parseAsName(), value) + +public operator fun MutableVisionProperties.set(name: Name, value: String): Unit = + setValue(name, value.asValue()) + +public operator fun MutableVisionProperties.set(name: String, value: String): Unit = + set(name.parseAsName(), value) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt deleted file mode 100644 index 83b6c93c..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt +++ /dev/null @@ -1,29 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.names.Name - -/** - * Property containers are used to create a symmetric behaviors for vision properties and style builders - */ -public interface VisionPropertyContainer { - - public fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Meta? -} - -public open class SimpleVisionPropertyContainer( - public val meta: MutableMeta, -) : VisionPropertyContainer { - override fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Meta? = meta.getMeta(name) -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index 82e59c2c..4315066a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -9,14 +9,13 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node -import space.kscience.visionforge.properties @Serializable @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, ) : VisionOfHtmlInput() { - public var values: Meta? by properties().node() + public var values: Meta? by mutableProperties.node() } public class HtmlFormFragment internal constructor( diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt index 34f49027..19106240 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt @@ -5,12 +5,15 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.number import space.kscience.dataforge.meta.string -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.properties +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.* + +//TODO replace by something +internal val Vision.mutableProperties get() = properties[Name.EMPTY, false, false] @Serializable -public abstract class VisionOfHtmlInput : VisionGroup() { - public var disabled: Boolean by properties().boolean(false) +public abstract class VisionOfHtmlInput : AbstractVision() { + public var disabled: Boolean by mutableProperties.boolean { false } } @Serializable @@ -19,7 +22,7 @@ public class VisionOfTextField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var text: String? by properties().string() + public var text: String? by mutableProperties.string() } @Serializable @@ -28,7 +31,7 @@ public class VisionOfCheckbox( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var checked: Boolean? by properties().boolean() + public var checked: Boolean? by mutableProperties.boolean() } @Serializable @@ -37,7 +40,7 @@ public class VisionOfNumberField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var value: Number? by properties().number() + public var value: Number? by mutableProperties.number() } @Serializable @@ -49,6 +52,6 @@ public class VisionOfRangeField( public val label: String? = null, public val name: String? = null, ) : VisionOfHtmlInput() { - public var value: Number? by properties().number() + public var value: Number? by mutableProperties.number() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt deleted file mode 100644 index 185c98a9..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt +++ /dev/null @@ -1,91 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.number -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -//public fun Vision.propertyNode( -// name: Name? = null, -// inherit: Boolean = false, -// includeStyles: Boolean = true, -// includeDefaults: Boolean = true, -//): ReadWriteProperty = object : ReadWriteProperty { -// override fun getValue(thisRef: Any?, property: KProperty<*>): Meta? = -// getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) -// -// override fun setValue(thisRef: Any?, property: KProperty<*>, value: Meta?) { -// meta.setMeta(name ?: Name.parse(property.name), value) -// } -//} -// -//public fun Vision.propertyNode( -// converter: MetaConverter, -// name: Name? = null, -// inherit: Boolean = false, -// includeStyles: Boolean = true, -// includeDefaults: Boolean = true, -//): ReadWriteProperty = object : ReadWriteProperty { -// override fun getValue(thisRef: Any?, property: KProperty<*>): T? = getProperty( -// name ?: Name.parse(property.name), -// inherit, -// includeStyles, -// includeDefaults -// )?.let(converter::metaToObject) -// -// override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) { -// meta.setMeta(name ?: Name.parse(property.name), value?.let(converter::objectToMeta)) -// } -//} - -public fun Vision.propertyValue( - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, -): ReadWriteProperty = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): Value? = - getPropertyValue(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Value?) { - setPropertyValue(name ?: Name.parse(property.name), value) - } -} - -public fun Vision.propertyValue( - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, - setter: (T) -> Value? = { it?.let(Value::of) }, - getter: (Value?) -> T, -): ReadWriteProperty = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): T = getPropertyValue( - name ?: Name.parse(property.name), - inherit, - includeStyles, - includeDefaults - ).let(getter) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - setPropertyValue(name ?: Name.parse(property.name), value?.let(setter)) - } -} - -public fun Vision.numberProperty( - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true -): ReadWriteProperty = propertyValue(name, inherit, includeStyles, includeDefaults) { it?.number } - -public fun Vision.numberProperty( - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, - default: () -> Number -): ReadWriteProperty = propertyValue(name, inherit, includeStyles, includeDefaults) { - it?.number ?: default() -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt index 3ba313a9..4ceab3d9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visitor/VisionVisitor.kt @@ -6,7 +6,8 @@ import kotlinx.coroutines.launch import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.visionforge.Vision -import space.kscience.visionforge.iterator +import space.kscience.visionforge.children +import space.kscience.visionforge.forEach public interface VisionVisitor { /** @@ -37,7 +38,7 @@ public interface VisionVisitor { visionVisitor.visitChildren(name, vision) - for ((token, child) in vision.children) { + vision.children?.forEach { token, child -> visitTreeAsync(visionVisitor, name + token, child) } } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index b7b8208d..d6128963 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -30,9 +30,10 @@ fun FlowContent.renderVisionFragment( @DFExperimental -class HtmlTagTest { +private fun VisionOutput.base(block: VisionGroup.() -> Unit) = VisionGroup().apply(block) - fun VisionOutput.base(block: VisionGroup.() -> Unit) = VisionGroup().apply(block) +@DFExperimental +class HtmlTagTest { val fragment: HtmlVisionFragment = { div { @@ -42,8 +43,8 @@ class HtmlTagTest { "metaProperty" put 87 } base { - setPropertyValue("myProp", 82) - setPropertyValue("otherProp", false) + properties["myProp"] = 82 + properties["otherProp"] = false } } } @@ -53,7 +54,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - vision.getProperty(Name.EMPTY).items.forEach { + vision.properties.raw?.items?.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 234d0043..f488bcf7 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -8,45 +8,47 @@ import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.boolean import space.kscience.dataforge.values.int import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.getProperty -import space.kscience.visionforge.getPropertyValue -import space.kscience.visionforge.setPropertyValue +import space.kscience.visionforge.get +import space.kscience.visionforge.getValue +import space.kscience.visionforge.set import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals -class VisionPropertyTest { - @Test - fun testPropertyWrite(){ - val vision = VisionGroup() - vision.setPropertyValue("fff", 2) - vision.setPropertyValue("fff.ddd", false) - assertEquals(2, vision.getPropertyValue("fff")?.int) - assertEquals(false, vision.getPropertyValue("fff.ddd")?.boolean) +private class TestScheme : Scheme() { + var ddd by int() + + companion object : SchemeSpec(::TestScheme) +} + +internal class VisionPropertyTest { + @Test + fun testPropertyWrite() { + val vision = VisionGroup() + vision.properties["fff"] = 2 + vision.properties["fff.ddd"] = false + + assertEquals(2, vision.properties.getValue("fff")?.int) + assertEquals(false, vision.properties.getValue("fff.ddd")?.boolean) } @Test - fun testPropertyEdit(){ + fun testPropertyEdit() { val vision = VisionGroup() - vision.getProperty("fff.ddd").apply { + vision.properties["fff.ddd"].apply { value = 2.asValue() } - assertEquals(2, vision.getPropertyValue("fff.ddd")?.int) - assertNotEquals(true, vision.getPropertyValue("fff.ddd")?.boolean) - } - - internal class TestScheme: Scheme(){ - var ddd by int() - companion object: SchemeSpec(::TestScheme) + assertEquals(2, vision.properties.getValue("fff.ddd")?.int) + assertNotEquals(true, vision.properties.getValue("fff.ddd")?.boolean) } @Test - fun testPropertyUpdate(){ + fun testPropertyUpdate() { val vision = VisionGroup() - vision.getProperty("fff").updateWith(TestScheme){ + vision.properties["fff"].updateWith(TestScheme) { ddd = 2 } - assertEquals(2, vision.getPropertyValue("fff.ddd")?.int) + assertEquals(2, vision.properties.getValue("fff.ddd")?.int) } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index 7b1299f4..0185dc43 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -9,7 +9,6 @@ import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision -import space.kscience.visionforge.getProperty import space.kscience.visionforge.getStyle import space.kscience.visionforge.styles import tornadofx.* diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index cd45c6e1..90c94b35 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -16,7 +16,6 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.misc.Type -import space.kscience.visionforge.getProperty import space.kscience.visionforge.solid.FX3DFactory.Companion.TYPE import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_WIREFRAME_KEY @@ -77,7 +76,7 @@ public class FX3DPlugin : AbstractPlugin() { is PolyLine -> PolyLine3D( obj.points.map { Point3D(it.x, it.y, it.z) }, obj.thickness.toFloat(), - obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).color() + obj.get(SolidMaterial.MATERIAL_COLOR_KEY).color() ).apply { this.meshView.cullFace = CullFace.FRONT } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 680033d4..78d02164 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision -import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange import tornadofx.* diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt index afc6c99a..b2dbce57 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt @@ -76,7 +76,7 @@ public fun SolidGroup.markLayers(thresholds: List = listOf(500, 1000, 20000 node.vision.layer = layerIndex remaining -= node.selfCount * (node.children.size + 1) - logger?.apply { + logger.run { if (node.selfCount > 1) { info { "Prototype with name ${node.name} moved to layer $layerIndex. $remaining nodes remains" } } else { diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 880a1961..732358bf 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -7,13 +7,12 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.getProperty +import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") -public class VisionOfPlotly private constructor() : VisionGroup() { +public class VisionOfPlotly private constructor() : AbstractVision() { public constructor(plot: Plot) : this() { setProperty(Name.EMPTY, plot.meta) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 39b7e7b0..62a3b2a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -7,7 +7,7 @@ import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.getProperty +import space.kscience.visionforge.root import kotlin.properties.ReadOnlyProperty @VisionBuilder @@ -29,7 +29,7 @@ public class ColorAccessor( } public fun Vision.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> - ColorAccessor(getProperty(Name.EMPTY), property.name.asName()) + ColorAccessor(properties.root(), property.name.asName()) } public var ColorAccessor?.string: String? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index d300b06b..f30c641b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.visionforge.* @@ -19,10 +18,10 @@ public class Composite( public val compositeType: CompositeType, public val first: Solid, public val second: Solid, -) : SolidBase(), VisionPropertyContainer +) : SolidBase() @VisionBuilder -public inline fun VisionContainerBuilder.composite( +public inline fun MutableVisionContainer.composite( type: CompositeType, name: String? = null, @VisionBuilder builder: SolidGroup.() -> Unit, @@ -34,7 +33,7 @@ public inline fun VisionContainerBuilder.composite( } val res = Composite(type, children[0], children[1]) - res.setProperty(Name.EMPTY, group.getProperty(Name.EMPTY)) + res.properties[Name.EMPTY] = group.properties.raw set(name, res) return res @@ -50,7 +49,7 @@ public fun SolidGroup.smartComposite( @VisionBuilder builder: SolidGroup.() -> Unit, ): Solid = if (type == CompositeType.GROUP) { val group = SolidGroup(builder) - if (name == null && group.meta.isEmpty()) { + if (name == null && group.properties.raw == null) { //append directly to group if no properties are defined group.items.forEach { (_, value) -> value.parent = null @@ -66,19 +65,19 @@ public fun SolidGroup.smartComposite( } @VisionBuilder -public inline fun VisionContainerBuilder.union( +public inline fun MutableVisionContainer.union( name: String? = null, builder: SolidGroup.() -> Unit, ): Composite = composite(CompositeType.UNION, name, builder = builder) @VisionBuilder -public inline fun VisionContainerBuilder.subtract( +public inline fun MutableVisionContainer.subtract( name: String? = null, builder: SolidGroup.() -> Unit, ): Composite = composite(CompositeType.SUBTRACT, name, builder = builder) @VisionBuilder -public inline fun VisionContainerBuilder.intersect( +public inline fun MutableVisionContainer.intersect( name: String? = null, builder: SolidGroup.() -> Unit, ): Composite = composite(CompositeType.INTERSECT, name, builder = builder) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt index 560ec496..1a8e4a9d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder import space.kscience.visionforge.set import kotlin.math.cos import kotlin.math.sin @@ -20,7 +20,7 @@ public class ConeSegment( public val topRadius: Float, public val startAngle: Float = 0f, public val angle: Float = PI2 -) : SolidBase(), GeometrySolid { +) : SolidBase(), GeometrySolid { override fun toGeometry(geometryBuilder: GeometryBuilder) { val segments = detail ?: 32 @@ -67,7 +67,7 @@ public class ConeSegment( } @VisionBuilder -public inline fun VisionContainerBuilder.cylinder( +public inline fun MutableVisionContainer.cylinder( r: Number, height: Number, name: String? = null, @@ -79,7 +79,7 @@ public inline fun VisionContainerBuilder.cylinder( ).apply(block).also { set(name, it) } @VisionBuilder -public inline fun VisionContainerBuilder.cone( +public inline fun MutableVisionContainer.cone( bottomRadius: Number, height: Number, upperRadius: Number = 0.0, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index 25f79ee8..b5a4d5cf 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set import kotlin.math.PI import kotlin.math.cos @@ -24,7 +23,7 @@ public class ConeSurface( public val topInnerRadius: Float, public val startAngle: Float = 0f, public val angle: Float = PI2, -) : SolidBase(), GeometrySolid, VisionPropertyContainer { +) : SolidBase(), GeometrySolid { init { require(bottomRadius > 0) { "Cone surface bottom radius must be positive" } @@ -124,7 +123,7 @@ public class ConeSurface( @VisionBuilder -public inline fun VisionContainerBuilder.tube( +public inline fun MutableVisionContainer.tube( radius: Number, height: Number, innerRadius: Number, @@ -143,7 +142,7 @@ public inline fun VisionContainerBuilder.tube( ).apply(block).also { set(name, it) } @VisionBuilder -public inline fun VisionContainerBuilder.coneSurface( +public inline fun MutableVisionContainer.coneSurface( bottomOuterRadius: Number, bottomInnerRadius: Number, height: Number, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt index 24d1ff16..ad0a456e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt @@ -2,16 +2,17 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.VisionPropertyContainer +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.set @Serializable @SerialName("solid.convex") -public class Convex(public val points: List) : SolidBase(), VisionPropertyContainer +public class Convex(public val points: List) : SolidBase() -public inline fun VisionContainerBuilder.convex(name: String? = null, action: ConvexBuilder.() -> Unit = {}): Convex = - ConvexBuilder().apply(action).build().also { set(name, it) } +public inline fun MutableVisionContainer.convex( + name: String? = null, + action: ConvexBuilder.() -> Unit = {}, +): Convex = ConvexBuilder().apply(action).build().also { set(name, it) } public class ConvexBuilder { private val points = ArrayList() diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 6e5a8bb7..0b1c2e20 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import kotlin.math.PI @@ -41,7 +40,7 @@ public data class Layer(var x: Float, var y: Float, var z: Float, var scale: Flo public class Extruded( public val shape: List, public val layers: List, -) : SolidBase(), GeometrySolid, VisionPropertyContainer { +) : SolidBase(), GeometrySolid { override fun toGeometry(geometryBuilder: GeometryBuilder) { val shape: Shape2D = shape @@ -96,11 +95,9 @@ public class Extruded( public class ExtrudeBuilder( public var shape: List = emptyList(), - public var layers: MutableList = ArrayList(), - - config: ObservableMutableMeta = MutableMeta(), -) : SimpleVisionPropertyContainer(config) { + public val properties: MutableMeta = MutableMeta(), +) { public fun shape(block: Shape2DBuilder.() -> Unit) { this.shape = Shape2DBuilder().apply(block).build() } @@ -110,12 +107,12 @@ public class ExtrudeBuilder( } internal fun build(): Extruded = Extruded(shape, layers).apply { - setProperty(Name.EMPTY, getProperty(Name.EMPTY)) + this.properties[Name.EMPTY] = this@ExtrudeBuilder.properties } } @VisionBuilder -public fun VisionContainerBuilder.extruded( +public fun MutableVisionContainer.extruded( name: String? = null, action: ExtrudeBuilder.() -> Unit = {}, ): Extruded = ExtrudeBuilder().apply(action).build().also { set(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt index 7f42a3eb..b327f9bf 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder import space.kscience.visionforge.set public interface Hexagon : GeometrySolid { @@ -35,7 +35,7 @@ public class Box( public val xSize: Float, public val ySize: Float, public val zSize: Float, -) : SolidBase(), Hexagon { +) : SolidBase(), Hexagon { private inline val dx get() = xSize / 2 private inline val dy get() = ySize / 2 @@ -52,7 +52,7 @@ public class Box( } @VisionBuilder -public inline fun VisionContainerBuilder.box( +public inline fun MutableVisionContainer.box( xSize: Number, ySize: Number, zSize: Number, @@ -71,10 +71,10 @@ public class GenericHexagon( override val node6: Point3D, override val node7: Point3D, override val node8: Point3D, -) : SolidBase(), Hexagon +) : SolidBase(), Hexagon @VisionBuilder -public inline fun VisionContainerBuilder.hexagon( +public inline fun MutableVisionContainer.hexagon( node1: Point3D, node2: Point3D, node3: Point3D, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 6bab2cf3..3f90d903 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -5,15 +5,16 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.number import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.* @Serializable -public abstract class LightSource : SolidBase() { +public abstract class LightSource : SolidBase() { override val descriptor: MetaDescriptor get() = LightSource.descriptor public val color: ColorAccessor by color() - public var intensity: Number by numberProperty(includeStyles = false) { 1.0 } + public var intensity: Number by properties.root(includeStyles = false).number { 1.0 } public companion object{ public val descriptor: MetaDescriptor by lazy { @@ -51,7 +52,7 @@ public abstract class LightSource : SolidBase() { public class AmbientLightSource : LightSource() @VisionBuilder -public fun VisionContainerBuilder.ambientLight( +public fun MutableVisionContainer.ambientLight( name: String? = "@ambientLight", block: AmbientLightSource.() -> Unit = {}, ): AmbientLightSource = AmbientLightSource().apply(block).also { set(name, it) } @@ -62,7 +63,7 @@ public class PointLightSource : LightSource() @VisionBuilder -public fun VisionContainerBuilder.pointLight( +public fun MutableVisionContainer.pointLight( x: Number, y: Number, z: Number, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index 05d58744..df28b344 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -2,27 +2,19 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.plus +import space.kscience.dataforge.meta.number import space.kscience.visionforge.* @Serializable @SerialName("solid.line") -public class PolyLine(public val points: List) : SolidBase(), VisionPropertyContainer { +public class PolyLine(public val points: List) : SolidBase() { //var lineType by string() - public var thickness: Number by numberProperty(name = SolidMaterial.MATERIAL_KEY + THICKNESS_KEY) { 1.0 } - - - public companion object { - public val THICKNESS_KEY: Name = "thickness".asName() - } - + public var thickness: Number by properties[SolidMaterial.MATERIAL_KEY].number { 1.0 } } @VisionBuilder -public fun VisionContainerBuilder.polyline( +public fun MutableVisionContainer.polyline( vararg points: Point3D, name: String? = null, action: PolyLine.() -> Unit = {}, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index c3111d4e..1cfc1d3b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -115,9 +115,9 @@ public interface Solid : Vision { * Get the layer number this solid belongs to. Return 0 if layer is not defined. */ public var Solid.layer: Int - get() = getPropertyValue(LAYER_KEY, inherit = true)?.int ?: 0 + get() = properties.getValue(LAYER_KEY, inherit = true)?.int ?: 0 set(value) { - setPropertyValue(LAYER_KEY, value) + properties.set(LAYER_KEY, value) } // Common properties @@ -135,24 +135,24 @@ public enum class RotationOrder { * Rotation order */ public var Solid.rotationOrder: RotationOrder - get() = getPropertyValue(Solid.ROTATION_ORDER_KEY)?.enum() ?: RotationOrder.XYZ - set(value) = setPropertyValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) + get() = properties.getValue(Solid.ROTATION_ORDER_KEY)?.enum() ?: RotationOrder.XYZ + set(value) = properties.setValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) /** * Preferred number of polygons for displaying the object. If not defined, uses shape or renderer default. Not inherited */ public var Solid.detail: Int? - get() = getPropertyValue(DETAIL_KEY, inherit = false)?.int - set(value) = setPropertyValue(DETAIL_KEY, value?.asValue()) + get() = properties.getValue(DETAIL_KEY, inherit = false)?.int + set(value) = properties.setValue(DETAIL_KEY, value?.asValue()) /** * If this property is true, the object will be ignored on render. * Property is not inherited. */ public var Vision.ignore: Boolean? - get() = getPropertyValue(IGNORE_KEY, inherit = false)?.boolean - set(value) = setPropertyValue(IGNORE_KEY, value?.asValue()) + get() = properties.getValue(IGNORE_KEY, inherit = false, includeStyles = false)?.boolean + set(value) = properties.setValue(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? // get() = getProperty(SELECTED_KEY).boolean @@ -161,18 +161,18 @@ public var Vision.ignore: Boolean? internal fun float(name: Name, default: Number): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Number { - return thisRef.getPropertyValue(name)?.number ?: default + return thisRef.properties.getValue(name)?.number ?: default } override fun setValue(thisRef: Solid, property: KProperty<*>, value: Number) { - thisRef.setPropertyValue(name, value) + thisRef.properties.setValue(name, value.asValue()) } } internal fun point(name: Name, default: Float): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { - val item = thisRef.meta[name] ?: return null + val item = thisRef.properties.raw?.get(name) ?: return null return object : Point3D { override val x: Float get() = item[X_KEY]?.float ?: default override val y: Float get() = item[Y_KEY]?.float ?: default @@ -182,11 +182,11 @@ internal fun point(name: Name, default: Float): ReadWriteProperty, value: Point3D?) { if (value == null) { - thisRef.setProperty(name, null) + thisRef.properties[name] = null } else { - thisRef.setPropertyValue(name + X_KEY, value.x) - thisRef.setPropertyValue(name + Y_KEY, value.y) - thisRef.setPropertyValue(name + Z_KEY, value.z) + thisRef.properties[name + X_KEY] = value.x + thisRef.properties[name + Y_KEY] = value.y + thisRef.properties[name + Z_KEY] = value.z } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 6d4b2faf..7aef3f82 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,24 +2,11 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.names.Name import space.kscience.visionforge.AbstractVision -import space.kscience.visionforge.VisionChildren @Serializable @SerialName("solid") -public open class SolidBase : AbstractVision(), Solid { +public open class SolidBase : AbstractVision(), Solid { override val descriptor: MetaDescriptor get() = Solid.descriptor - override val children: VisionChildren get() = VisionChildren.empty(this) - - override fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): MutableMeta { - return super.getProperty(name, inherit, includeStyles, includeDefaults) - } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 20528056..e514dee4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -16,7 +16,7 @@ public interface PrototypeHolder { * Build or update prototype tree */ @VisionBuilder - public fun prototypes(builder: VisionContainerBuilder.() -> Unit) + public fun prototypes(builder: MutableVisionContainer.() -> Unit) /** * Resolve a prototype from this container. Should never return a ref. @@ -30,7 +30,7 @@ public interface PrototypeHolder { */ @Serializable @SerialName("group.solid") -public class SolidGroup : VisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, VisionContainerBuilder { +public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, MutableVisionContainer { public val items: Map get() = children.keys.mapNotNull { @@ -59,7 +59,7 @@ public class SolidGroup : VisionGroup(), Solid, PrototypeHolder, MutableVisionGr /** * Create or edit prototype node as a group */ - override fun prototypes(builder: VisionContainerBuilder.() -> Unit): Unit { + override fun prototypes(builder: MutableVisionContainer.() -> Unit): Unit { (prototypes ?: SolidGroup().also { prototypes = it }).children.run(builder) } @@ -82,7 +82,7 @@ public class SolidGroup : VisionGroup(), Solid, PrototypeHolder, MutableVisionGr public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) @VisionBuilder -public fun VisionContainerBuilder.group( +public fun MutableVisionContainer.group( name: Name? = null, builder: SolidGroup.() -> Unit = {}, ): SolidGroup = SolidGroup(builder).also { set(name, it) } @@ -91,7 +91,7 @@ public fun VisionContainerBuilder.group( * Define a group with given [name], attach it to this parent and return it. */ @VisionBuilder -public fun VisionContainerBuilder.group( +public fun MutableVisionContainer.group( name: String, action: SolidGroup.() -> Unit = {}, ): SolidGroup = SolidGroup(action).also { set(name, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt index 8cf27881..649e7f7c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set @Serializable @@ -13,10 +12,10 @@ public class SolidLabel( public val text: String, public val fontSize: Double, public val fontFamily: String, -) : SolidBase(), VisionPropertyContainer +) : SolidBase() @VisionBuilder -public fun VisionContainerBuilder.label( +public fun MutableVisionContainer.label( text: String, fontSize: Number = 20, fontFamily: String = "Arial", diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index c68af09c..87a39ac4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -102,19 +102,19 @@ public class SolidMaterial : Scheme() { } public val Solid.color: ColorAccessor - get() = ColorAccessor(getProperty(Name.EMPTY), MATERIAL_COLOR_KEY) + get() = ColorAccessor(properties.root(), MATERIAL_COLOR_KEY) public var Solid.material: SolidMaterial? - get() = SolidMaterial.read(getProperty(MATERIAL_KEY)) - set(value) = setProperty(MATERIAL_KEY, value?.meta) + get() = SolidMaterial.read(properties[MATERIAL_KEY]) + set(value) = properties.set(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - getProperty(MATERIAL_KEY).updateWith(SolidMaterial, builder) + properties[MATERIAL_KEY].updateWith(SolidMaterial, builder) } public var Solid.opacity: Number? - get() = getPropertyValue(MATERIAL_OPACITY_KEY, inherit = true)?.number + get() = properties.getValue(MATERIAL_OPACITY_KEY, inherit = true)?.number set(value) { - setPropertyValue(MATERIAL_OPACITY_KEY, value?.asValue()) + properties.setValue(MATERIAL_OPACITY_KEY, value?.asValue()) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 8e6e6f59..3e34212a 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -1,14 +1,15 @@ package space.kscience.visionforge.solid -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.Meta +import kotlinx.serialization.Transient +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.visionforge.* +import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX @@ -23,6 +24,71 @@ public val Vision.unref: Solid else -> error("This Vision is neither Solid nor SolidReference") } +@Serializable +@SerialName("solid.ref") +public class SolidReference( + @SerialName("prototype") public val prototypeName: Name, +) : SolidBase(), VisionGroup { + + /** + * The prototype for this reference. + */ + public val prototype: Solid by lazy { + //Recursively search for defined template in the parent + if (parent == null) error("No parent is present for SolidReference") + if (parent !is PrototypeHolder) error("Parent does not hold prototypes") + (parent as? PrototypeHolder)?.getPrototype(prototypeName) + ?: error("Prototype with name $prototypeName not found") + } + + override val descriptor: MetaDescriptor get() = prototype.descriptor + + override val defaultProperties: Meta + get() = prototype.properties.raw?.withDefault(descriptor.defaultNode) ?: descriptor.defaultNode + + override val children: VisionChildren + get() = object : VisionChildren { + override val group: Vision get() = this@SolidReference + + override val keys: Set get() = prototype.children?.keys ?: emptySet() + + override val changes: Flow get() = emptyFlow() + + override fun get(token: NameToken): SolidReferenceChild? { + if (token !in (prototype.children?.keys ?: emptySet())) return null + return SolidReferenceChild(this@SolidReference, this@SolidReference, token.asName()) + } + } + +// override fun getPropertyValue( +// name: Name, +// inherit: Boolean, +// includeStyles: Boolean, +// includeDefaults: Boolean, +// ): Value? { +// meta?.getValue(name)?.let { return it } +// if (includeStyles) { +// getStyleProperty(name)?.value?.let { return it } +// } +// prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } +// if (inherit) { +// parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } +// } +// return null +// } +// +// override fun getProperty( +// name: Name, +// inherit: Boolean, +// includeStyles: Boolean, +// includeDefaults: Boolean, +// ): MutableMeta = VisionProperties(this, name, descriptor[name], inherit, includeStyles, prototype.meta) + + public companion object { + public const val REFERENCE_CHILD_PROPERTY_PREFIX: String = "@child" + } +} + /** * @param name A name of reference child relative to prototype root */ @@ -30,62 +96,74 @@ internal class SolidReferenceChild( val owner: SolidReference, override var parent: Vision?, val childName: Name, -) : Solid { +) : Solid, VisionGroup { val prototype: Solid - get() = owner.prototype.children[childName] as? Solid + get() = owner.prototype.children?.get(childName) as? Solid ?: error("Prototype with name $childName not found") - override val meta: Meta get() = owner.getProperty(childToken(childName).asName()) + override val descriptor: MetaDescriptor get() = prototype.descriptor - override fun getPropertyValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Value? { - owner.getPropertyValue( - childPropertyName(childName, name), inherit, includeStyles, includeDefaults - )?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.value?.let { return it } + @Transient + override val properties: MutableVisionProperties = object : MutableVisionProperties { + override val descriptor: MetaDescriptor get() = this@SolidReferenceChild.descriptor + override val default: Meta + get() = prototype.properties.raw?.withDefault(descriptor.defaultNode) ?: descriptor.defaultNode + + override val raw: MutableMeta by lazy { owner.properties[childToken(childName).asName()] } + + override fun getValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): Value? { + raw[name]?.value?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.value?.let { return it } + } + if (inherit) { + parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } + } + return default[name]?.value } - prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } - if (inherit) { - parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } + + override fun set(name: Name, node: Meta?) { + raw.setMeta(name, node) } - return null - } - override fun setProperty(name: Name, node: Meta?) { - owner.setProperty(childPropertyName(childName, name), node) - } + override fun setValue(name: Name, value: Value?) { + raw.setValue(name, value) + } + override val changes: Flow get() = owner.properties.changes.filter { it.startsWith(childToken(childName)) } - override fun setPropertyValue(name: Name, value: Value?) { - owner.setPropertyValue(childPropertyName(childName, name), value) - } - - override val propertyChanges: SharedFlow - get() = TODO("Not yet implemented") - - override fun invalidateProperty(propertyName: Name) { - owner.invalidateProperty(childPropertyName(childName, propertyName)) + override fun invalidate(propertyName: Name) { + owner.properties.invalidate(childPropertyName(childName, propertyName)) + } } override fun update(change: VisionChange) { - TODO("Not yet implemented") + change.children?.forEach { (name, change) -> + when { + change.delete -> error("Deleting children inside ref is not allowed.") + change.vision != null -> error("Updating content of the ref is not allowed") + else -> children[name]?.update(change) + } + } + change.properties?.let { + updateProperties(it, Name.EMPTY) + } } override val children: VisionChildren = object : VisionChildren { - override val parent: Vision get() = this@SolidReferenceChild + override val group: Vision get() = this@SolidReferenceChild - override val keys: Set get() = prototype.children.keys + override val keys: Set get() = prototype.children?.keys ?: emptySet() override val changes: Flow get() = emptyFlow() override fun get(token: NameToken): SolidReferenceChild? { - if (token !in prototype.children.keys) return null + if (token !in (prototype.children?.keys ?: emptySet())) return null return SolidReferenceChild(this@SolidReferenceChild.owner, this@SolidReferenceChild, childName + token) } } @@ -101,51 +179,15 @@ internal class SolidReferenceChild( } } -@Serializable -@SerialName("solid.ref") -public class SolidReference( - @SerialName("prototype") public val prototypeName: Name, -) : SolidBase() { - - /** - * The prototype for this reference. - */ - public val prototype: Solid by lazy { - //Recursively search for defined template in the parent - if (parent == null) error("No parent is present for SolidReference") - if (parent !is PrototypeHolder) error("Parent does not hold prototypes") - (parent as? PrototypeHolder)?.getPrototype(prototypeName) - ?: error("Prototype with name $prototypeName not found") - } - - override val children: VisionChildren - get() = object : VisionChildren { - override val parent: Vision get() = this@SolidReference - - override val keys: Set get() = prototype.children.keys - - override val changes: Flow get() = emptyFlow() - - override fun get(token: NameToken): SolidReferenceChild? { - if (token !in prototype.children.keys) return null - return SolidReferenceChild(this@SolidReference, this@SolidReference, token.asName()) - } - } - - public companion object{ - public const val REFERENCE_CHILD_PROPERTY_PREFIX: String = "@child" - } -} - /** * Create ref for existing prototype */ -public fun VisionContainerBuilder.ref( +public fun MutableVisionContainer.ref( templateName: Name, name: String? = null, ): SolidReference = SolidReference(templateName).also { set(name, it) } -public fun VisionContainerBuilder.ref( +public fun MutableVisionContainer.ref( templateName: String, name: String? = null, ): SolidReference = ref(Name.parse(templateName), name) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 6e9d00d9..722c97f8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -6,6 +6,7 @@ import kotlinx.serialization.modules.PolymorphicModuleBuilder import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass +import kotlinx.serialization.serializer import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag @@ -47,12 +48,12 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { public val serializersModuleForSolids: SerializersModule = SerializersModule { polymorphic(Vision::class) { - subclass(VisionGroup.serializer()) + subclass(SimpleVisionGroup.serializer()) solids() } polymorphic(Solid::class) { - default { SolidBase.serializer() } + default { SolidBase.serializer(serializer()) } solids() } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt index 45305e4a..0ce0d893 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set import kotlin.math.PI import kotlin.math.cos @@ -17,8 +16,8 @@ public class Sphere( public val phiStart: Float = 0f, public val phi: Float = PI2, public val thetaStart: Float = 0f, - public val theta: Float = PI .toFloat(), -) : SolidBase(), GeometrySolid, VisionPropertyContainer { + public val theta: Float = PI.toFloat(), +) : SolidBase(), GeometrySolid { override fun toGeometry(geometryBuilder: GeometryBuilder) { fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Point3D { @@ -53,7 +52,7 @@ public class Sphere( } @VisionBuilder -public inline fun VisionContainerBuilder.sphere( +public inline fun MutableVisionContainer.sphere( radius: Number, name: String? = null, action: Sphere.() -> Unit = {}, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt index b5ae5500..709968af 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder import space.kscience.visionforge.set import kotlin.math.PI import kotlin.math.cos @@ -21,7 +21,7 @@ public class SphereLayer( public val phi: Float = PI2, public val thetaStart: Float = 0f, public val theta: Float = PI.toFloat(), -) : SolidBase(), GeometrySolid { +) : SolidBase(), GeometrySolid { override fun toGeometry(geometryBuilder: GeometryBuilder): Unit = geometryBuilder.run { require(outerRadius > 0) { "Outer radius must be positive" } @@ -69,7 +69,7 @@ public class SphereLayer( } @VisionBuilder -public inline fun VisionContainerBuilder.sphereLayer( +public inline fun MutableVisionContainer.sphereLayer( outerRadius: Number, innerRadius: Number, phiStart: Number = 0f, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index bab2e518..dbdc58ec 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid.transform import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.getProperty +import space.kscience.visionforge.root import space.kscience.visionforge.solid.* private operator fun Number.plus(other: Number) = toFloat() + other.toFloat() @@ -20,7 +20,7 @@ internal fun Solid.updateFrom(other: Solid): Solid { scaleX *= other.scaleX scaleY *= other.scaleY scaleZ *= other.scaleZ - setProperty(Name.EMPTY, other.getProperty(Name.EMPTY)) + properties[Name.EMPTY] = other.properties.root() return this } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index 8e6f0b89..688712e6 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -1,9 +1,8 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.int +import space.kscience.dataforge.values.string import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals @@ -17,7 +16,7 @@ class PropertyTest { //meta["color"] = "pink" color.set("pink") } - assertEquals("pink", box.meta["material.color"]?.string) + assertEquals("pink", box.properties.getValue("material.color")?.string) assertEquals("pink", box.color.string) } @@ -43,12 +42,12 @@ class PropertyTest { fun testInheritedProperty() { var box: Box? = null val group = SolidGroup().apply { - setPropertyValue("test", 22) + properties["test"] = 22 group { box = box(100, 100, 100) } } - assertEquals(22, box?.getPropertyValue("test", inherit = true)?.int) + assertEquals(22, box?.properties?.getValue("test", inherit = true)?.int) } @Test @@ -66,7 +65,7 @@ class PropertyTest { } } } - assertEquals(22, box?.getPropertyValue("test")?.int) + assertEquals(22, box?.properties?.getValue("test")?.int) } @Test diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 70cb9c4e..baad6110 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -31,7 +31,7 @@ class SerializationTest { val string = Solids.encodeToString(cube) println(string) val newCube = Solids.decodeFromString(string) - assertEquals(cube.meta, newCube.meta) + assertEquals(cube.properties.raw, newCube.properties.raw) } @Test @@ -52,7 +52,7 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group.children["cube"]?.meta, reconstructed.children["cube"]?.meta) + assertEquals(group.children["cube"]?.properties?.raw, reconstructed.children["cube"]?.properties?.raw) } @Test diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index d76398fc..cb870da8 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -12,7 +12,7 @@ import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.tables.* -import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.properties import kotlin.jvm.JvmName @@ -42,10 +42,14 @@ public val ColumnHeader.properties: ValueColumnScheme get() = ValueColumn @SerialName("vision.table") public class VisionOfTable( override val headers: List<@Serializable(ColumnHeaderSerializer::class) ColumnHeader>, -) : VisionGroup(), Rows { +) : AbstractVision(), Rows { public var data: List - get() = meta.getIndexed("rows").entries.sortedBy { it.key?.toInt() }.map { it.value } + get() = meta?.getIndexed("rows")?.entries?.sortedBy { + it.key?.toInt() + }?.map { + it.value + } ?: emptyList() set(value) { //TODO Make it better properties()["rows"] = value diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 68b44fc5..b7d8244d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -10,7 +10,6 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.setPropertyValue import space.kscience.visionforge.solid.Solid diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 3fb87c7b..42a8b6e6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -11,7 +11,6 @@ import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.CanvasTextBaseline import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.MIDDLE -import space.kscience.visionforge.getProperty import space.kscience.visionforge.solid.SolidLabel import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG @@ -27,7 +26,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" + context.fillStyle = obj.get(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index da1984f3..6e9c7472 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,7 +4,6 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments -import space.kscience.visionforge.getProperty import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial @@ -25,7 +24,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - obj.getProperty(SolidMaterial.MATERIAL_KEY), + obj.get(SolidMaterial.MATERIAL_KEY), false ) -- 2.34.1 From c71042ae06346fbe362426145a243febba2bee83 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 8 Aug 2022 22:17:06 +0300 Subject: [PATCH 078/143] [WIP] great refactoring in progress --- .../kscience/visionforge/AbstractVision.kt | 6 +- .../kscience/visionforge/VisionChange.kt | 19 ++--- .../kscience/visionforge/VisionContainer.kt | 79 +++++++++---------- .../space/kscience/visionforge/VisionGroup.kt | 46 ++++------- visionforge-plotly/build.gradle.kts | 2 +- visionforge-solid/build.gradle.kts | 5 ++ .../visionforge/solid/SolidReference.kt | 24 ------ .../visionforge/solid/PropertyTest.kt | 28 ++++--- .../visionforge/solid/SolidReferenceTest.kt | 2 + .../visionforge/solid/VisionUpdateTest.kt | 6 +- visionforge-tables/build.gradle.kts | 2 +- 11 files changed, 96 insertions(+), 123 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt index f6b38880..0e0e043d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -15,13 +16,14 @@ import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import kotlin.jvm.Synchronized +@Serializable public abstract class AbstractVision : Vision { @Transient override var parent: Vision? = null @SerialName("properties") - internal var _properties: MutableMeta? = null + protected var _properties: MutableMeta? = null protected open val defaultProperties: Meta? get() = descriptor?.defaultNode @@ -80,7 +82,7 @@ public abstract class AbstractVision : Vision { } @Transient - private val _changes = MutableSharedFlow() + private val _changes = MutableSharedFlow(10) override val changes: SharedFlow get() = _changes override fun invalidate(propertyName: Name) { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index a4667b2f..33bbd5ca 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -16,7 +16,7 @@ import kotlin.time.Duration /** * Create a deep copy of given Vision without external connections. */ -private fun Vision.deepCopy(): Vision { +private fun Vision.deepCopy(manager: VisionManager): Vision { //Assuming that unrooted visions are already isolated //TODO replace by efficient deep copy val json = manager.encodeToJsonElement(this) @@ -26,7 +26,7 @@ private fun Vision.deepCopy(): Vision { /** * An update for a [Vision] */ -public class VisionChangeBuilder : MutableVisionContainer { +public class VisionChangeBuilder(private val manager: VisionManager) : MutableVisionContainer { private var reset: Boolean = false private var vision: Vision? = null @@ -37,7 +37,7 @@ public class VisionChangeBuilder : MutableVisionContainer { @Synchronized private fun getOrPutChild(visionName: Name): VisionChangeBuilder = - children.getOrPut(visionName) { VisionChangeBuilder() } + children.getOrPut(visionName) { VisionChangeBuilder(manager) } public fun propertyChanged(visionName: Name, propertyName: Name, item: Meta?) { if (visionName == Name.EMPTY) { @@ -61,7 +61,7 @@ public class VisionChangeBuilder : MutableVisionContainer { */ public fun deepCopy(): VisionChange = VisionChange( reset, - vision?.deepCopy(), + vision?.deepCopy(manager), if (propertyChange.isEmpty()) null else propertyChange.seal(), if (children.isEmpty()) null else children.mapValues { it.value.deepCopy() } ) @@ -81,8 +81,8 @@ public data class VisionChange( public val children: Map? = null, ) -public inline fun VisionChange(block: VisionChangeBuilder.() -> Unit): VisionChange = - VisionChangeBuilder().apply(block).deepCopy() +public inline fun VisionManager.VisionChange(block: VisionChangeBuilder.() -> Unit): VisionChange = + VisionChangeBuilder(this).apply(block).deepCopy() private fun CoroutineScope.collectChange( @@ -119,14 +119,15 @@ private fun CoroutineScope.collectChange( */ public fun Vision.flowChanges( collectionDuration: Duration, + manager: VisionManager = this.manager, ): Flow = flow { - var collector = VisionChangeBuilder() + var collector = VisionChangeBuilder(manager) coroutineScope { collectChange(Name.EMPTY, this@flowChanges) { collector } //Send initial vision state - val initialChange = VisionChange(vision = deepCopy()) + val initialChange = VisionChange(vision = deepCopy(manager)) emit(initialChange) while (currentCoroutineContext().isActive) { @@ -137,7 +138,7 @@ public fun Vision.flowChanges( //emit changes emit(collector.deepCopy()) //Reset the collector - collector = VisionChangeBuilder() + collector = VisionChangeBuilder(manager) } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 81f7d9da..4ce69047 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -4,12 +4,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.serializer import space.kscience.dataforge.names.* @DslMarker @@ -60,9 +54,9 @@ public inline fun VisionChildren.forEach(block: (NameToken, Vision) -> Unit) { keys.forEach { block(it, get(it)!!) } } -@Serializable(VisionChildrenContainerSerializer::class) public interface MutableVisionChildren : VisionChildren, MutableVisionContainer { - public override val group: MutableVisionGroup? + + public override val group: MutableVisionGroup public operator fun set(token: NameToken, value: Vision?) @@ -83,9 +77,9 @@ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer< else -> { val currentParent = get(name.first()) if (currentParent != null && currentParent !is MutableVisionGroup) error("Can't assign a child to $currentParent") - val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: group?.createGroup().also { + val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: group.createGroup().also { set(name.first(), it) - } ?: error("Container owner not set") + } parent.children[name.cutFirst()] = child } } @@ -113,27 +107,26 @@ public operator fun MutableVisionContainer.set( str: String?, vision: V?, ): Unit = set(str?.parseAsName(), vision) -internal class VisionChildrenImpl( - items: Map, +internal abstract class VisionChildrenImpl( + override val group: MutableVisionGroup, ) : MutableVisionChildren { - override var group: MutableVisionGroup? = null - internal set - - private val items = LinkedHashMap(items) private val updateJobs = HashMap() - private val scope: CoroutineScope? get() = group?.manager?.context + abstract val items: MutableMap? + abstract fun buildItems(): MutableMap - override val keys: Set get() = items.keys + private val scope: CoroutineScope get() = group.manager.context - override fun get(token: NameToken): Vision? = items[token] + override val keys: Set get() = items?.keys ?: emptySet() + + override fun get(token: NameToken): Vision? = items?.get(token) private val _changes = MutableSharedFlow() override val changes: SharedFlow get() = _changes private fun onChange(name: Name) { - scope?.launch { + scope.launch { _changes.emit(name) } } @@ -149,16 +142,16 @@ internal class VisionChildrenImpl( } if (value == null) { - items.remove(token) + items?.remove(token) } else { - items[token] = value + (items ?: buildItems())[token] = value //check if parent already exists and is different from the current one if (value.parent != null && value.parent != group) error("Can't reassign parent Vision for $value") //set parent value.parent = group //start update jobs (only if the vision is rooted) - scope?.let { scope -> - val job = (value.children as? VisionChildrenImpl)?.changes?.onEach { + scope.let { scope -> + val job = value.children?.changes?.onEach { onChange(token + it) }?.launchIn(scope) if (job != null) { @@ -171,30 +164,30 @@ internal class VisionChildrenImpl( } override fun clear() { - if (items.isNotEmpty()) { + if (!items.isNullOrEmpty()) { updateJobs.values.forEach { it.cancel() } updateJobs.clear() - items.clear() + items?.clear() onChange(Name.EMPTY) } } } - -internal object VisionChildrenContainerSerializer : KSerializer { - private val mapSerializer = serializer>() - - override val descriptor: SerialDescriptor = mapSerializer.descriptor - - override fun deserialize(decoder: Decoder): MutableVisionChildren { - val map = decoder.decodeSerializableValue(mapSerializer) - return VisionChildrenImpl(map) - } - - override fun serialize(encoder: Encoder, value: MutableVisionChildren) { - val map = value.keys.associateWith { value[it]!! } - encoder.encodeSerializableValue(mapSerializer, map) - } - -} +// +//internal object VisionChildrenContainerSerializer : KSerializer { +// private val mapSerializer = serializer>() +// +// override val descriptor: SerialDescriptor = mapSerializer.descriptor +// +// override fun deserialize(decoder: Decoder): MutableVisionChildren { +// val map = decoder.decodeSerializableValue(mapSerializer) +// return VisionChildrenImpl(map) +// } +// +// override fun serialize(encoder: Encoder, value: MutableVisionChildren) { +// val map = value.keys.associateWith { value[it]!! } +// encoder.encodeSerializableValue(mapSerializer, map) +// } +// +//} diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index f87650a7..9535fbd9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -1,10 +1,7 @@ package space.kscience.visionforge -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value @@ -33,6 +30,7 @@ public val Vision.children: VisionChildren? get() = (this as? VisionGroup)?.chil /** * A full base implementation for a [Vision] */ +@Serializable public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup { override fun update(change: VisionChange) { @@ -49,38 +47,26 @@ public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup } @SerialName("children") - protected var _children: MutableVisionChildren? = null + protected var _children: MutableMap? = null - @Transient - override val children: MutableVisionChildren = object : MutableVisionChildren { - @Synchronized - fun getOrCreateChildren(): MutableVisionChildren { - if (_children == null) { - _children = VisionChildrenImpl(emptyMap()).apply { - group = this@AbstractVisionGroup + init { + _children?.forEach { it.value.parent = this } + } + + override val children: MutableVisionChildren by lazy { + object : VisionChildrenImpl(this){ + override val items: MutableMap? + get() = this@AbstractVisionGroup._children + + @Synchronized + override fun buildItems(): MutableMap { + if (_children == null) { + _children = LinkedHashMap() } + return _children!! } - return _children!! - } - override val group: MutableVisionGroup get() = this@AbstractVisionGroup - - override val keys: Set get() = _children?.keys ?: emptySet() - override val changes: Flow get() = _children?.changes ?: emptyFlow() - - override fun get(token: NameToken): Vision? = _children?.get(token) - - override fun set(token: NameToken, value: Vision?) { - getOrCreateChildren()[token] = value - } - - override fun set(name: Name?, child: Vision?) { - getOrCreateChildren()[name] = child - } - - override fun clear() { - _children?.clear() } } diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index caeb4e52..1c1ed308 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.mpp") } -val plotlyVersion = "0.5.0" +val plotlyVersion = "0.5.3-dev-1" kscience { useSerialization() diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index e00830d5..ce669659 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -15,6 +15,11 @@ kotlin { api(project(":visionforge-core")) } } + commonTest{ + dependencies{ + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4") + } + } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 3e34212a..aa79734f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -60,30 +60,6 @@ public class SolidReference( } } -// override fun getPropertyValue( -// name: Name, -// inherit: Boolean, -// includeStyles: Boolean, -// includeDefaults: Boolean, -// ): Value? { -// meta?.getValue(name)?.let { return it } -// if (includeStyles) { -// getStyleProperty(name)?.value?.let { return it } -// } -// prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } -// if (inherit) { -// parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } -// } -// return null -// } -// -// override fun getProperty( -// name: Name, -// inherit: Boolean, -// includeStyles: Boolean, -// includeDefaults: Boolean, -// ): MutableMeta = VisionProperties(this, name, descriptor[name], inherit, includeStyles, prototype.meta) - public companion object { public const val REFERENCE_CHILD_PROPERTY_PREFIX: String = "@child" } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index 688712e6..bb6f5de1 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -1,5 +1,9 @@ package space.kscience.visionforge.solid +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.withTimeout import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.int import space.kscience.dataforge.values.string @@ -10,8 +14,8 @@ import kotlin.test.assertEquals @Suppress("UNUSED_VARIABLE") class PropertyTest { @Test - fun testColor(){ - val box = Box(10.0f, 10.0f,10.0f) + fun testColor() { + val box = Box(10.0f, 10.0f, 10.0f) box.material { //meta["color"] = "pink" color.set("pink") @@ -20,14 +24,17 @@ class PropertyTest { assertEquals("pink", box.color.string) } + @OptIn(ExperimentalCoroutinesApi::class) @Test - fun testColorUpdate(){ - val box = Box(10.0f, 10.0f,10.0f) + fun testColorUpdate() = runTest { + val box = Box(10.0f, 10.0f, 10.0f) + + val c = CompletableDeferred() + - var c: String? = null box.onPropertyChange { - if(it == SolidMaterial.MATERIAL_COLOR_KEY){ - c = box.color.string + if (it == SolidMaterial.MATERIAL_COLOR_KEY) { + c.complete(box.color.string) } } @@ -35,7 +42,8 @@ class PropertyTest { color.set("pink") } - assertEquals("pink", c) + assertEquals("pink", withTimeout(50) { c.await() }) + } @Test @@ -53,7 +61,7 @@ class PropertyTest { @Test fun testStyleProperty() { var box: Box? = null - val group = SolidGroup{ + val group = SolidGroup { styleSheet { update("testStyle") { "test" put 22 @@ -89,7 +97,7 @@ class PropertyTest { @Test fun testReferenceStyleProperty() { var box: SolidReference? = null - val group = SolidGroup{ + val group = SolidGroup { styleSheet { update("testStyle") { SolidMaterial.MATERIAL_COLOR_KEY put "#555555" diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index 4726f246..f74426ba 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.json.encodeToJsonElement import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.names.get import space.kscience.visionforge.get import space.kscience.visionforge.style import space.kscience.visionforge.useStyle @@ -30,6 +31,7 @@ class SolidReferenceTest { fun testReferenceSerialization(){ val serialized = Solids.jsonForSolids.encodeToJsonElement(groupWithReference) val deserialized = Solids.jsonForSolids.decodeFromJsonElement(SolidGroup.serializer(), serialized) + assertEquals(groupWithReference.items["test"]?.color.string, deserialized.items["test"]?.color.string) assertEquals("blue", (deserialized.children["test"] as Solid).color.string) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 3fbf3ad4..026499f4 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -11,7 +11,7 @@ import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue -class VisionUpdateTest { +internal class VisionUpdateTest { val solidManager = Global.fetch(Solids) val visionManager = solidManager.visionManager @@ -20,7 +20,7 @@ class VisionUpdateTest { val targetVision = SolidGroup { box(200,200,200, name = "origin") } - val dif = VisionChange{ + val dif = visionManager.VisionChange{ group ("top") { color.set(123) box(100,100,100) @@ -36,7 +36,7 @@ class VisionUpdateTest { @Test fun testVisionChangeSerialization(){ - val change = VisionChange{ + val change = visionManager.VisionChange{ group("top") { color.set(123) box(100,100,100) diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 4326da36..d4e86bf1 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.mpp") } -val tablesVersion = "0.2.0-dev-1" +val tablesVersion = "0.2.0-dev-3" kscience { useSerialization() -- 2.34.1 From 47bde02488084521897d75fda7af113b5aedc7fc Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 9 Aug 2022 12:49:01 +0300 Subject: [PATCH 079/143] [WIP] Completed solid refactoring --- .../kscience/visionforge/AbstractVision.kt | 99 ++----------------- .../space/kscience/visionforge/Vision.kt | 7 +- .../kscience/visionforge/VisionContainer.kt | 12 ++- .../space/kscience/visionforge/VisionGroup.kt | 21 ++-- .../kscience/visionforge/VisionProperties.kt | 89 ++++++++++++++++- .../visionforge/solid/SolidReference.kt | 49 +++++---- 6 files changed, 147 insertions(+), 130 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt index 0e0e043d..e7df2198 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt @@ -1,19 +1,10 @@ package space.kscience.visionforge -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.isEmpty -import space.kscience.dataforge.values.Value -import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties -import kotlin.jvm.Synchronized @Serializable @@ -23,91 +14,17 @@ public abstract class AbstractVision : Vision { override var parent: Vision? = null @SerialName("properties") - protected var _properties: MutableMeta? = null + protected var propertiesInternal: MutableMeta? = null - protected open val defaultProperties: Meta? get() = descriptor?.defaultNode - - @Transient - final override val properties: MutableVisionProperties = object : MutableVisionProperties { - override val descriptor: MetaDescriptor? get() = this@AbstractVision.descriptor - override val default: Meta? get() = defaultProperties - - @Synchronized - private fun getOrCreateProperties(): MutableMeta { - if (_properties == null) { - //TODO check performance issues - val newProperties = MutableMeta() - _properties = newProperties - } - return _properties!! + final override val properties: MutableVisionProperties by lazy { + object : AbstractVisionProperties(this) { + override var properties: MutableMeta? + get() = propertiesInternal + set(value) { + propertiesInternal = value + } } - - override val raw: Meta? get() = _properties - - override fun getValue( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - ): Value? { - raw?.get(name)?.value?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.value?.let { return it } - } - if (inherit) { - parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } - } - return default?.get(name)?.value - } - - override fun set(name: Name, node: Meta?) { - //TODO check old value? - if (name.isEmpty()) { - _properties = node?.asMutableMeta() - } else if (node == null) { - _properties?.setMeta(name, node) - } else { - getOrCreateProperties().setMeta(name, node) - } - invalidate(name) - } - - override fun setValue(name: Name, value: Value?) { - //TODO check old value? - if (value == null) { - _properties?.getMeta(name)?.value = null - } else { - getOrCreateProperties().setValue(name, value) - } - invalidate(name) - } - - @Transient - private val _changes = MutableSharedFlow(10) - override val changes: SharedFlow get() = _changes - - override fun invalidate(propertyName: Name) { - if (propertyName == Vision.STYLE_KEY) { - styles.asSequence() - .mapNotNull { getStyle(it) } - .flatMap { it.items.asSequence() } - .distinctBy { it.key } - .forEach { - invalidate(it.key.asName()) - } - } - manager.context.launch { - _changes.emit(propertyName) - } - } - } override val descriptor: MetaDescriptor? get() = null - - - override fun update(change: VisionChange) { - change.properties?.let { - updateProperties(it, Name.EMPTY) - } - } } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index e538b226..7bdcbe54 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -12,6 +12,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.boolean +import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import space.kscience.visionforge.Vision.Companion.TYPE import kotlin.reflect.KProperty1 @@ -37,7 +38,11 @@ public interface Vision : Described { /** * Update this vision using a dif represented by [VisionChange]. */ - public fun update(change: VisionChange) + public fun update(change: VisionChange) { + change.properties?.let { + updateProperties(it, Name.EMPTY) + } + } override val descriptor: MetaDescriptor? diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 4ce69047..529c01a1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import space.kscience.dataforge.names.* +import kotlin.jvm.Synchronized @DslMarker public annotation class VisionBuilder @@ -113,8 +114,15 @@ internal abstract class VisionChildrenImpl( private val updateJobs = HashMap() - abstract val items: MutableMap? - abstract fun buildItems(): MutableMap + abstract var items: MutableMap? + + @Synchronized + private fun buildItems(): MutableMap { + if (items == null) { + items = LinkedHashMap() + } + return items!! + } private val scope: CoroutineScope get() = group.manager.context diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 9535fbd9..f666fcd8 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY import kotlin.js.JsName -import kotlin.jvm.Synchronized public interface VisionGroup : Vision { @@ -47,26 +46,20 @@ public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup } @SerialName("children") - protected var _children: MutableMap? = null + protected var childrenInternal: MutableMap? = null init { - _children?.forEach { it.value.parent = this } + childrenInternal?.forEach { it.value.parent = this } } override val children: MutableVisionChildren by lazy { - object : VisionChildrenImpl(this){ - override val items: MutableMap? - get() = this@AbstractVisionGroup._children - - @Synchronized - override fun buildItems(): MutableMap { - if (_children == null) { - _children = LinkedHashMap() + object : VisionChildrenImpl(this) { + override var items: MutableMap? + get() = this@AbstractVisionGroup.childrenInternal + set(value) { + this@AbstractVisionGroup.childrenInternal = value } - return _children!! - } - } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index b4ca16ec..a750df5b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,17 +1,20 @@ package space.kscience.visionforge import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch +import kotlinx.serialization.Transient import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.asMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.get -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.parseAsName -import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue +import kotlin.jvm.Synchronized public interface VisionProperties { @@ -21,7 +24,6 @@ public interface VisionProperties { public val raw: Meta? public val descriptor: MetaDescriptor? - public val default: Meta? public fun getValue( name: Name, @@ -130,6 +132,83 @@ private class VisionPropertiesItem( override fun hashCode(): Int = Meta.hashCode(this) } +public abstract class AbstractVisionProperties( + private val vision: Vision, +) : MutableVisionProperties { + override val descriptor: MetaDescriptor? get() = vision.descriptor + protected val default: Meta? get() = descriptor?.defaultNode + + protected abstract var properties: MutableMeta? + + override val raw: Meta? get() = properties + + @Synchronized + protected fun getOrCreateProperties(): MutableMeta { + if (properties == null) { + //TODO check performance issues + val newProperties = MutableMeta() + properties = newProperties + } + return properties!! + } + + override fun getValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + ): Value? { + raw?.get(name)?.value?.let { return it } + if (includeStyles) { + vision.getStyleProperty(name)?.value?.let { return it } + } + if (inherit) { + vision.parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } + } + return default?.get(name)?.value + } + + override fun set(name: Name, node: Meta?) { + //TODO check old value? + if (name.isEmpty()) { + properties = node?.asMutableMeta() + } else if (node == null) { + properties?.setMeta(name, node) + } else { + getOrCreateProperties().setMeta(name, node) + } + invalidate(name) + } + + override fun setValue(name: Name, value: Value?) { + //TODO check old value? + if (value == null) { + properties?.getMeta(name)?.value = null + } else { + getOrCreateProperties().setValue(name, value) + } + invalidate(name) + } + + @Transient + private val _changes = MutableSharedFlow(10) + override val changes: SharedFlow get() = _changes + + override fun invalidate(propertyName: Name) { + if (propertyName == Vision.STYLE_KEY) { + vision.styles.asSequence() + .mapNotNull { vision.getStyle(it) } + .flatMap { it.items.asSequence() } + .distinctBy { it.key } + .forEach { + invalidate(it.key.asName()) + } + } + vision.manager.context.launch { + _changes.emit(propertyName) + } + } +} + public fun VisionProperties.getValue( name: Name, inherit: Boolean? = null, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index aa79734f..5428a7dd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -28,7 +28,10 @@ public val Vision.unref: Solid @SerialName("solid.ref") public class SolidReference( @SerialName("prototype") public val prototypeName: Name, -) : SolidBase(), VisionGroup { +) : VisionGroup, Solid { + + @Transient + override var parent: Vision? = null /** * The prototype for this reference. @@ -40,11 +43,30 @@ public class SolidReference( (parent as? PrototypeHolder)?.getPrototype(prototypeName) ?: error("Prototype with name $prototypeName not found") } - override val descriptor: MetaDescriptor get() = prototype.descriptor - override val defaultProperties: Meta - get() = prototype.properties.raw?.withDefault(descriptor.defaultNode) ?: descriptor.defaultNode + @SerialName("properties") + private var propertiesInternal: MutableMeta? = null + + override val properties: MutableVisionProperties by lazy { + object : AbstractVisionProperties(this) { + override var properties: MutableMeta? + get() = propertiesInternal + set(value) { + propertiesInternal = value + } + + override val raw: Meta? get() = properties + + override fun get(name: Name, inherit: Boolean, includeStyles: Boolean): MutableMeta { + return properties?.getMeta(name) ?: prototype.properties.get(name, inherit, includeStyles) + } + + override fun getValue(name: Name, inherit: Boolean, includeStyles: Boolean): Value? { + return properties?.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) + } + } + } override val children: VisionChildren get() = object : VisionChildren { @@ -66,7 +88,7 @@ public class SolidReference( } /** - * @param name A name of reference child relative to prototype root + * @param childName A name of reference child relative to prototype root */ internal class SolidReferenceChild( val owner: SolidReference, @@ -83,25 +105,17 @@ internal class SolidReferenceChild( @Transient override val properties: MutableVisionProperties = object : MutableVisionProperties { override val descriptor: MetaDescriptor get() = this@SolidReferenceChild.descriptor - override val default: Meta - get() = prototype.properties.raw?.withDefault(descriptor.defaultNode) ?: descriptor.defaultNode override val raw: MutableMeta by lazy { owner.properties[childToken(childName).asName()] } + override fun get(name: Name, inherit: Boolean, includeStyles: Boolean): MutableMeta = + raw.getMeta(name) ?: prototype.properties.get(name, inherit, includeStyles) + override fun getValue( name: Name, inherit: Boolean, includeStyles: Boolean, - ): Value? { - raw[name]?.value?.let { return it } - if (includeStyles) { - getStyleProperty(name)?.value?.let { return it } - } - if (inherit) { - parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } - } - return default[name]?.value - } + ): Value? = raw.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) override fun set(name: Name, node: Meta?) { raw.setMeta(name, node) @@ -110,6 +124,7 @@ internal class SolidReferenceChild( override fun setValue(name: Name, value: Value?) { raw.setValue(name, value) } + override val changes: Flow get() = owner.properties.changes.filter { it.startsWith(childToken(childName)) } override fun invalidate(propertyName: Name) { -- 2.34.1 From 9221df785d2553b7890957fa1d7078e132db37a6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 9 Aug 2022 14:53:46 +0300 Subject: [PATCH 080/143] [WIP] Completed solid refactoring --- build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/DObject.kt | 1 - .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 10 +++---- .../mipt/npm/root/serialization/jsonToRoot.kt | 7 +++-- .../visionforge/gdml/GDMLVisionTest.kt | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 2 +- .../src/jvmMain/kotlin/allThingsDemo.kt | 2 +- .../src/jvmMain/kotlin/rootParser.kt | 2 +- demo/playground/src/jvmMain/kotlin/tables.kt | 2 +- .../visionforge/solid/demo/VariableBox.kt | 2 +- .../visionforge/solid/demo/MetaEditorDemo.kt | 2 +- .../visionforge/react/MultiSelectChooser.kt | 4 +-- .../visionforge/react/RangeValueChooser.kt | 2 +- .../visionforge/react/valueChooser.kt | 4 --- .../space/kscience/visionforge/Colors.kt | 7 +---- .../space/kscience/visionforge/StyleSheet.kt | 2 -- .../space/kscience/visionforge/Vision.kt | 4 +-- .../kscience/visionforge/VisionChange.kt | 1 - .../space/kscience/visionforge/VisionGroup.kt | 2 +- .../kscience/visionforge/VisionProperties.kt | 7 +---- .../kscience/visionforge/visionDescriptor.kt | 3 +- .../visionforge/meta/VisionPropertyTest.kt | 8 +---- .../visionforge/editor/ColorValueChooser.kt | 6 +--- .../editor/ComboBoxValueChooser.kt | 6 +--- .../visionforge/editor/FXMetaModel.kt | 6 +--- .../kscience/visionforge/editor/MetaViewer.kt | 2 +- .../visionforge/editor/TextValueChooser.kt | 3 +- .../visionforge/editor/ValueCallback.kt | 2 +- .../visionforge/editor/ValueChooser.kt | 4 +-- .../visionforge/editor/ValueChooserBase.kt | 4 +-- .../editor/VisionEditorFragment.kt | 5 ++-- .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +- .../kscience/visionforge/solid/FXMaterials.kt | 8 +---- .../solid/VisualObjectFXBinding.kt | 7 +++-- .../kscience/visionforge/gdml/gdmlLoader.kt | 2 +- .../visionforge/markup/VisionOfMarkup.kt | 10 +++---- .../visionforge/plotly/VisionOfPlotly.kt | 5 ++-- .../visionforge/solid/ColorAccessor.kt | 2 +- .../kscience/visionforge/solid/LightSource.kt | 2 +- .../space/kscience/visionforge/solid/Solid.kt | 4 +-- .../visionforge/solid/SolidMaterial.kt | 5 +--- .../visionforge/solid/SolidReference.kt | 1 - .../solid/specifications/Canvas3DOptions.kt | 2 +- .../visionforge/solid/DescriptorTest.kt | 2 +- .../visionforge/solid/PropertyTest.kt | 4 +-- .../visionforge/solid/VisionUpdateTest.kt | 2 +- .../visionforge/tables/VisionOfTable.kt | 13 ++++----- .../visionforge/tables/VisionOfTableTest.kt | 8 ++--- .../solid/three/MeshThreeFactory.kt | 11 +++---- .../solid/three/ThreeCanvasLabelFactory.kt | 3 +- .../visionforge/solid/three/ThreeJsVision.kt | 2 +- .../solid/three/ThreeLineFactory.kt | 3 +- .../visionforge/solid/three/ThreeMaterials.kt | 29 +++++++------------ 53 files changed, 97 insertions(+), 147 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f0c9d504..d02cd7c5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.6.0-dev-12") +val dataforgeVersion by extra("0.6.0-dev-13") val fxVersion by extra("11") allprojects{ diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 5af50c3f..8b67c108 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -5,7 +5,6 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.misc.Named import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.doubleArray import kotlin.properties.ReadOnlyProperty public fun MetaProvider.doubleArray( diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 8cc4c258..48a21ff1 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,13 +1,13 @@ package ru.mipt.npm.root import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.doubleArray import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.doubleArray import space.kscience.visionforge.isEmpty -import space.kscience.visionforge.setPropertyValue +import space.kscience.visionforge.set import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* @@ -321,7 +321,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? } return if (group.children.isEmpty()) { null - } else if (group.items.size == 1 && group.meta== null) { + } else if (group.items.size == 1 && group.properties.raw == null) { group.items.values.first().apply { parent = null } } else { group @@ -348,7 +348,7 @@ private fun SolidGroup.addRootVolume( if (!cache) { val group = buildVolume(volume, context)?.apply { volume.fFillColor?.let { - setPropertyValue(MATERIAL_COLOR_KEY, RootColors[it]) + properties[MATERIAL_COLOR_KEY] = RootColors[it] } block() } @@ -365,7 +365,7 @@ private fun SolidGroup.addRootVolume( ref(templateName, name).apply { volume.fFillColor?.let { - setPropertyValue(MATERIAL_COLOR_KEY, RootColors[it]) + properties[MATERIAL_COLOR_KEY] = RootColors[it] } block() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index 5d338394..b4a63748 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -14,7 +14,7 @@ import kotlinx.serialization.modules.subclass private fun jsonRootDeserializer( tSerializer: KSerializer, - builder: (JsonElement) -> T + builder: (JsonElement) -> T, ): DeserializationStrategy = object : DeserializationStrategy { private val jsonElementSerializer = JsonElement.serializer() @@ -46,6 +46,7 @@ private object RootDecoder { private val refCache: List, ) : KSerializer by tSerializer { + @OptIn(ExperimentalSerializationApi::class) @Suppress("UNCHECKED_CAST") override fun deserialize(decoder: Decoder): T { val input = decoder as JsonDecoder @@ -92,7 +93,7 @@ private object RootDecoder { @OptIn(ExperimentalSerializationApi::class) fun unrefSerializersModule( - refCache: List + refCache: List, ): SerializersModule = SerializersModule { contextual(TObjArray::class) { @@ -197,11 +198,13 @@ private object RootDecoder { fillCache(it) } } + is JsonArray -> { element.forEach { fillCache(it) } } + else -> { //ignore primitives } diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index c46f49ff..0f74e9a8 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.gdml +import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.asValue import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Vision import space.kscience.visionforge.get diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index dff6da3f..4bf18124 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -69,7 +69,7 @@ class Model(val manager: VisionManager) { fun reset() { map.values.forEach { - it.setPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY, null) + it.properties[SolidMaterial.MATERIAL_COLOR_KEY] = null } tracks.children.clear() } diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 23b73af4..328387c1 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 -import space.kscience.dataforge.values.ValueType +import space.kscience.dataforge.meta.ValueType import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode import space.kscience.plotly.models.TextPosition diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 184557da..f88793ee 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -6,7 +6,7 @@ import ru.mipt.npm.root.toSolid import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf -import space.kscience.dataforge.values.string +import space.kscience.dataforge.meta.string import space.kscience.visionforge.solid.Solids import java.nio.file.Paths import java.util.zip.ZipInputStream diff --git a/demo/playground/src/jvmMain/kotlin/tables.kt b/demo/playground/src/jvmMain/kotlin/tables.kt index 46cad89d..ab27ebdf 100644 --- a/demo/playground/src/jvmMain/kotlin/tables.kt +++ b/demo/playground/src/jvmMain/kotlin/tables.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.values.ValueType +import space.kscience.dataforge.meta.ValueType import space.kscience.tables.ColumnHeader import space.kscience.tables.valueRow import space.kscience.visionforge.html.ResourceLocation diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index d429cafb..4ddc185a 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -3,12 +3,12 @@ package space.kscience.visionforge.solid.demo import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.BoxGeometry import info.laht.threekt.objects.Mesh +import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.values.asValue import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.set import space.kscience.visionforge.solid.SolidGroup diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt index 3cdf058e..a4217555 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt @@ -2,10 +2,10 @@ package space.kscience.visionforge.demo import javafx.geometry.Orientation import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.ValueType import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value -import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.editor.FXMetaModel import space.kscience.visionforge.editor.MetaViewer import space.kscience.visionforge.editor.MutableMetaEditor diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index f3c81a57..612fdfe6 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -10,9 +10,9 @@ import react.dom.attrs import react.dom.option import react.dom.select import react.fc +import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.string +import space.kscience.dataforge.meta.string @JsExport public val MultiSelectChooser: FC = fc("MultiSelectChooser") { props -> diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 8ccedc01..382209c2 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -10,11 +10,11 @@ import react.FC import react.dom.attrs import react.fc import react.useState +import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string -import space.kscience.dataforge.values.asValue import styled.css import styled.styledInput diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 03996c04..cd769414 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -19,10 +19,6 @@ import react.useState import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.int -import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors import space.kscience.visionforge.widgetType import styled.css diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt index 58be399e..ad4a4c0e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt @@ -1,11 +1,6 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.number -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.int -import space.kscience.dataforge.values.string +import space.kscience.dataforge.meta.* import kotlin.math.max /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index aed19706..9fc148b3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -5,8 +5,6 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.stringList import kotlin.jvm.JvmInline /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 7bdcbe54..9b8304de 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -4,14 +4,14 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import space.kscience.dataforge.context.Global +import space.kscience.dataforge.meta.asValue +import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.Described import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.boolean import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import space.kscience.visionforge.Vision.Companion.TYPE import kotlin.reflect.KProperty1 diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 33bbd5ca..d0a7ec70 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -9,7 +9,6 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.Null import kotlin.jvm.Synchronized import kotlin.time.Duration diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index f666fcd8..8faa21b4 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -3,12 +3,12 @@ package space.kscience.visionforge import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.ValueType import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY import kotlin.js.JsName diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index a750df5b..7b6c6e7b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -5,15 +5,10 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.asMutableMeta +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.asValue import kotlin.jvm.Synchronized public interface VisionProperties { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt index 3fa6703f..66ee43e0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt @@ -2,8 +2,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.* -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.set +import space.kscience.dataforge.meta.set private const val INHERITED_DESCRIPTOR_ATTRIBUTE = "inherited" private const val STYLE_DESCRIPTOR_ATTRIBUTE = "useStyles" diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index f488bcf7..23517112 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,12 +1,6 @@ package space.kscience.visionforge.meta -import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.SchemeSpec -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.updateWith -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.boolean -import space.kscience.dataforge.values.int +import space.kscience.dataforge.meta.* import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.get import space.kscience.visionforge.getValue diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ColorValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ColorValueChooser.kt index 442c299f..1161d5bf 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ColorValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ColorValueChooser.kt @@ -3,13 +3,9 @@ package space.kscience.visionforge.editor import javafx.scene.control.ColorPicker import javafx.scene.paint.Color import org.slf4j.LoggerFactory -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.Null -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.string import tornadofx.* /** diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt index a99599ee..a4c4e583 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt @@ -8,14 +8,10 @@ package space.kscience.visionforge.editor import javafx.collections.FXCollections import javafx.scene.control.ComboBox import javafx.util.StringConverter -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.parseValue -import space.kscience.dataforge.values.string import java.util.* public class ComboBoxValueChooser(public val values: Collection? = null) : ValueChooserBase>() { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt index 7d8e71b2..8c3d2584 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt @@ -5,14 +5,10 @@ import javafx.beans.binding.BooleanBinding import javafx.beans.binding.ListBinding import javafx.beans.binding.ObjectBinding import javafx.collections.ObservableList -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.ObservableMeta -import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Value import tornadofx.* /** diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt index 4563ade5..144b018e 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt @@ -21,7 +21,7 @@ import javafx.scene.control.TreeSortMode import javafx.scene.control.TreeTableView import javafx.scene.layout.BorderPane import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.values.string +import space.kscience.dataforge.meta.string import space.kscience.visionforge.dfIconView import tornadofx.* diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt index 9a1840ce..fd86ec72 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt @@ -9,11 +9,10 @@ import javafx.beans.value.ObservableValue import javafx.scene.control.TextField import javafx.scene.input.KeyCode import javafx.scene.input.KeyEvent -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.validate import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.* import tornadofx.* public class TextValueChooser : ValueChooserBase() { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt index a4e72871..c6d654f5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt @@ -5,7 +5,7 @@ */ package space.kscience.visionforge.editor -import space.kscience.dataforge.values.Value +import space.kscience.dataforge.meta.Value /** diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index f62513b0..ea43547c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -10,14 +10,14 @@ import javafx.beans.value.ObservableValue import javafx.scene.Node import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.Null +import space.kscience.dataforge.meta.Value import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.meta.descriptors.validate import space.kscience.dataforge.misc.Named import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.Null -import space.kscience.dataforge.values.Value import space.kscience.visionforge.widget import space.kscience.visionforge.widgetType import tornadofx.* diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt index e9b61886..a9adae8f 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt @@ -8,9 +8,9 @@ package space.kscience.visionforge.editor import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node import org.slf4j.LoggerFactory +import space.kscience.dataforge.meta.Null +import space.kscience.dataforge.meta.Value import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.values.Null -import space.kscience.dataforge.values.Value import tornadofx.* /** diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index 0185dc43..0fcc45f3 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.getStyle +import space.kscience.visionforge.root import space.kscience.visionforge.styles import tornadofx.* @@ -20,7 +21,7 @@ public class VisionEditorFragment : Fragment() { public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() private val configProperty: Binding = visionProperty.objectBinding { vision -> - vision?.getProperty(Name.EMPTY) + vision?.properties?.root() } private val configEditorProperty: Binding = configProperty.objectBinding(descriptorProperty) { @@ -28,7 +29,7 @@ public class VisionEditorFragment : Fragment() { val node:FXMetaModel = FXMetaModel( meta, vision?.descriptor, - vision?.meta, + vision?.properties?.root(), Name.EMPTY, "Vision properties" ) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 90c94b35..bac388ee 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -16,6 +16,7 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.misc.Type +import space.kscience.visionforge.get import space.kscience.visionforge.solid.FX3DFactory.Companion.TYPE import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_WIREFRAME_KEY @@ -76,7 +77,7 @@ public class FX3DPlugin : AbstractPlugin() { is PolyLine -> PolyLine3D( obj.points.map { Point3D(it.x, it.y, it.z) }, obj.thickness.toFloat(), - obj.get(SolidMaterial.MATERIAL_COLOR_KEY).color() + obj.properties.get(SolidMaterial.MATERIAL_COLOR_KEY).color() ).apply { this.meshView.cullFace = CullFace.FRONT } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt index ca5e6583..81bbad5b 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt @@ -3,13 +3,7 @@ package space.kscience.visionforge.solid import javafx.scene.paint.Color import javafx.scene.paint.Material import javafx.scene.paint.PhongMaterial -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.int -import space.kscience.dataforge.values.string +import space.kscience.dataforge.meta.* import space.kscience.visionforge.Colors import space.kscience.visionforge.solid.FXMaterials.GREY diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 78d02164..8d3e2836 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -5,8 +5,8 @@ import javafx.beans.binding.* import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision +import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange import tornadofx.* @@ -35,7 +35,7 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi public operator fun get(key: Name): ObjectBinding { return bindings.getOrPut(key) { object : ObjectBinding() { - override fun computeValue(): Meta = obj.getProperty(key) + override fun computeValue(): Meta = obj.properties[key] } } } @@ -57,4 +57,5 @@ public fun ObjectBinding.float(default: Float): FloatBinding = floatBindi public fun ObjectBinding.int(default: Int): IntegerBinding = integerBinding { it.int ?: default } public fun ObjectBinding.long(default: Long): LongBinding = longBinding { it.long ?: default } -public fun ObjectBinding.transform(transform: (Meta) -> T): Binding = objectBinding { it?.let(transform) } +public fun ObjectBinding.transform(transform: (Meta) -> T): Binding = + objectBinding { it?.let(transform) } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 34a9afa2..a102b2b3 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -30,7 +30,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { private val proto = SolidGroup() private val solids = proto.group(solidsName) { - setPropertyValue("edges.enabled", false) + properties["edges.enabled"] = false } private val referenceStore = HashMap>() diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index 93e7359e..ace39d2b 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -8,19 +8,19 @@ import kotlinx.serialization.modules.subclass import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName +import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.properties +import space.kscience.visionforge.root @Serializable @SerialName("vision.markup") public class VisionOfMarkup( - public val format: String = COMMONMARK_FORMAT -) : VisionGroup() { + public val format: String = COMMONMARK_FORMAT, +) : AbstractVision() { //TODO add templates - public var content: String? by properties().string(CONTENT_PROPERTY_KEY) + public var content: String? by properties.root().string(CONTENT_PROPERTY_KEY) public companion object { public val CONTENT_PROPERTY_KEY: Name = "content".asName() diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 732358bf..c23de631 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -9,16 +9,17 @@ import space.kscience.plotly.Plot import space.kscience.plotly.Plotly import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.html.VisionOutput +import space.kscience.visionforge.root @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor() : AbstractVision() { public constructor(plot: Plot) : this() { - setProperty(Name.EMPTY, plot.meta) + properties[Name.EMPTY] = plot.meta } - public val plot: Plot get() = Plot(getProperty(Name.EMPTY).asObservable()) + public val plot: Plot get() = Plot(properties.root().asObservable()) } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 62a3b2a0..dde24ef0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 3f90d903..13736fcd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -2,11 +2,11 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.ValueType import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.number -import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.* @Serializable diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 1cfc1d3b..d932a4b3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -1,15 +1,13 @@ package space.kscience.visionforge.solid +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.enum import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value -import space.kscience.dataforge.meta.float -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.* import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 87a39ac4..e8da3499 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -3,13 +3,10 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.set import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.number -import space.kscience.dataforge.values.set import space.kscience.visionforge.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 5428a7dd..e071d07b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -7,7 +7,6 @@ import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Value import space.kscience.visionforge.* import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index aa53d424..78e35dfa 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -4,8 +4,8 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.scheme import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.set import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.set import space.kscience.visionforge.hide import space.kscience.visionforge.widgetType diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt index 6f004f5c..87527802 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid +import space.kscience.dataforge.meta.ValueType import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.solid.specifications.Canvas3DOptions import kotlin.test.Test import kotlin.test.assertNotNull diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index bb6f5de1..2eb4c65d 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -4,9 +4,9 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withTimeout +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.int -import space.kscience.dataforge.values.string import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 026499f4..e5a13594 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -3,8 +3,8 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.asValue import space.kscience.visionforge.VisionChange import space.kscience.visionforge.get import kotlin.test.Test diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index cb870da8..20332974 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -8,13 +8,10 @@ import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import space.kscience.dataforge.meta.* import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.values.Null -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.asValue import space.kscience.tables.* import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.html.VisionOutput -import space.kscience.visionforge.properties +import space.kscience.visionforge.root import kotlin.jvm.JvmName import kotlin.reflect.typeOf @@ -45,14 +42,14 @@ public class VisionOfTable( ) : AbstractVision(), Rows { public var data: List - get() = meta?.getIndexed("rows")?.entries?.sortedBy { + get() = properties.root().getIndexed("rows").entries.sortedBy { it.key?.toInt() - }?.map { + }.map { it.value - } ?: emptyList() + } set(value) { //TODO Make it better - properties()["rows"] = value + properties.root()["rows"] = value } public val rows: List get() = data.map(::MetaRow) diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt index 8c9f755c..e3b199d1 100644 --- a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.tables -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.double -import space.kscience.dataforge.values.int +import space.kscience.dataforge.meta.Value +import space.kscience.dataforge.meta.asValue +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.int import space.kscience.tables.ColumnHeader import space.kscience.tables.ColumnTable import space.kscience.tables.get diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index b7d8244d..04f192fd 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -10,8 +10,9 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.setPropertyValue +import space.kscience.visionforge.set import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.layer @@ -76,8 +77,8 @@ public abstract class MeshThreeFactory( @VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { - setPropertyValue(EDGES_ENABLED_KEY, enabled) - SolidMaterial.write(getProperty(EDGES_MATERIAL_KEY)).apply(block) + properties.set(EDGES_ENABLED_KEY, enabled) + SolidMaterial.write(properties[EDGES_MATERIAL_KEY]).apply(block) } internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { @@ -93,9 +94,9 @@ internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { public fun Mesh.applyEdges(obj: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.getProperty(EDGES_ENABLED_KEY, inherit = true).boolean != false) { + if (obj.properties.get(EDGES_ENABLED_KEY, inherit = true).boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return - val material = ThreeMaterials.getLineMaterial(obj.getProperty(EDGES_MATERIAL_KEY), true) + val material = ThreeMaterials.getLineMaterial(obj.properties[EDGES_MATERIAL_KEY], true) if (edges == null) { add( LineSegments( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 42a8b6e6..8108389e 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -11,6 +11,7 @@ import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.CanvasTextBaseline import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.MIDDLE +import space.kscience.visionforge.get import space.kscience.visionforge.solid.SolidLabel import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG @@ -26,7 +27,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.get(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" + context.fillStyle = obj.properties[SolidMaterial.MATERIAL_COLOR_KEY].value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt index 27a5da44..7c709a5c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt @@ -6,6 +6,6 @@ import space.kscience.visionforge.solid.SolidBase /** * A custom visual object that has its own Three.js renderer */ -public abstract class ThreeJsVision : SolidBase() { +public abstract class ThreeJsVision : SolidBase() { public abstract fun render(three: ThreePlugin): Object3D } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index 6e9c7472..70938e99 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,6 +4,7 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments +import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial @@ -24,7 +25,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - obj.get(SolidMaterial.MATERIAL_KEY), + obj.properties[SolidMaterial.MATERIAL_KEY], false ) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index e0f3a4a6..a9f68f69 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -10,11 +10,7 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.* -import space.kscience.visionforge.Colors -import space.kscience.visionforge.Vision -import space.kscience.visionforge.computePropertyNode -import space.kscience.visionforge.getStyleNodes +import space.kscience.visionforge.* import space.kscience.visionforge.solid.ColorAccessor import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.SolidReference @@ -98,7 +94,8 @@ public object ThreeMaterials { * Compute color */ public fun Meta.threeColor(): Color? { - val value = getValue(Name.EMPTY) + if(isEmpty()) return null + val value = value return if (isLeaf) { when { value == null -> null @@ -132,19 +129,15 @@ private var Material.cached: Boolean } public fun Mesh.updateMaterial(vision: Vision) { - val ownMaterialMeta = vision.meta.getMeta(SolidMaterial.MATERIAL_KEY) + val ownMaterialMeta = vision.properties.raw?.get(SolidMaterial.MATERIAL_KEY) if (ownMaterialMeta == null) { if (vision is SolidReference && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty()) { updateMaterial(vision.prototype) } else { - material = vision.computePropertyNode(SolidMaterial.MATERIAL_KEY)?.let { - ThreeMaterials.cacheMaterial(it) - } ?: ThreeMaterials.DEFAULT + material = ThreeMaterials.cacheMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]) } } else { - material = vision.computePropertyNode(SolidMaterial.MATERIAL_KEY)?.let { - ThreeMaterials.buildMaterial(it) - } ?: ThreeMaterials.DEFAULT + material = ThreeMaterials.buildMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]) } } @@ -159,19 +152,19 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { - material.asDynamic().color = vision.computePropertyNode(SolidMaterial.MATERIAL_COLOR_KEY)?.threeColor() + material.asDynamic().color = vision.properties[SolidMaterial.MATERIAL_COLOR_KEY].threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.SPECULAR_COLOR_KEY -> { - material.asDynamic().specular = vision.computePropertyNode(SolidMaterial.SPECULAR_COLOR_KEY)?.threeColor() + material.asDynamic().specular = vision.properties[SolidMaterial.SPECULAR_COLOR_KEY].threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { - material.asDynamic().emissive = vision.computePropertyNode(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY)?.threeColor() + material.asDynamic().emissive = vision.properties[SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY].threeColor() ?: ThreeMaterials.BLACK_COLOR } SolidMaterial.MATERIAL_OPACITY_KEY -> { - val opacity = vision.getProperty( + val opacity = vision.properties.getValue( SolidMaterial.MATERIAL_OPACITY_KEY, inherit = true, )?.double ?: 1.0 @@ -179,7 +172,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { material.transparent = opacity < 1.0 } SolidMaterial.MATERIAL_WIREFRAME_KEY -> { - material.asDynamic().wireframe = vision.getProperty( + material.asDynamic().wireframe = vision.properties.getValue( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, )?.boolean ?: false -- 2.34.1 From 0ea1ee056a48c32538da677f57abbb56a59ea9b3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 12 Aug 2022 22:16:06 +0300 Subject: [PATCH 081/143] All tests pass --- build.gradle.kts | 2 +- cern-root-loader/build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 2 +- demo/gdml/build.gradle.kts | 8 +- .../visionforge/gdml/GDMLVisionTest.kt | 7 +- .../visionforge/gdml/demo/GDMLAppComponent.kt | 3 +- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 3 +- demo/js-playground/build.gradle.kts | 2 +- demo/muon-monitor/build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 2 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 3 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 1 + .../src/jsMain/resources/index.html | 1 - demo/sat-demo/build.gradle.kts | 2 +- demo/solid-showcase/build.gradle.kts | 6 +- .../visionforge/solid/demo/VariableBox.kt | 9 +- gradle.properties | 2 +- jupyter/build.gradle.kts | 4 +- .../visionforge-jupyter-gdml/build.gradle.kts | 4 +- settings.gradle.kts | 10 +- ui/bootstrap/build.gradle.kts | 2 +- .../visionforge/bootstrap/outputConfig.kt | 6 +- .../bootstrap/visionPropertyEditor.kt | 32 ++++-- ui/react/build.gradle.kts | 2 +- .../visionforge/react/MultiSelectChooser.kt | 2 +- .../visionforge/react/PropertyEditor.kt | 104 +++++++++++------- .../visionforge/react/RangeValueChooser.kt | 2 +- .../kscience/visionforge/react/VisionTree.kt | 13 ++- .../visionforge/react/valueChooser.kt | 16 +-- ui/ring/build.gradle.kts | 2 +- .../ThreeViewWithControls.kt | 42 ++++--- .../ringPropertyEditor.kt | 34 ++++-- .../ringThreeControls.kt | 6 +- visionforge-core/build.gradle.kts | 4 +- .../space/kscience/visionforge/StyleSheet.kt | 8 +- .../space/kscience/visionforge/Vision.kt | 14 ++- .../kscience/visionforge/VisionChange.kt | 6 +- .../kscience/visionforge/VisionContainer.kt | 6 +- .../kscience/visionforge/VisionManager.kt | 3 +- .../kscience/visionforge/VisionProperties.kt | 103 ++++++----------- .../visionforge/html/VisionOfHtmlInput.kt | 2 +- .../kscience/visionforge/html/HtmlTagTest.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 6 +- .../kscience/visionforge/VisionClient.kt | 2 +- visionforge-fx/build.gradle.kts | 8 +- .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +- .../solid/VisualObjectFXBinding.kt | 3 +- visionforge-gdml/build.gradle.kts | 7 +- .../kscience/visionforge/gdml/markLayers.kt | 3 +- .../src/commonTest/kotlin/TestCubes.kt | 2 +- visionforge-markdown/build.gradle.kts | 2 +- visionforge-plotly/build.gradle.kts | 2 +- .../visionforge/plotly/VisionOfPlotly.kt | 2 +- visionforge-server/build.gradle.kts | 2 +- .../visionforge/server/VisionServer.kt | 1 + visionforge-solid/build.gradle.kts | 9 +- .../visionforge/solid/ColorAccessor.kt | 2 +- .../kscience/visionforge/solid/Composite.kt | 4 +- .../kscience/visionforge/solid/Extruded.kt | 2 +- .../kscience/visionforge/solid/PolyLine.kt | 2 +- .../space/kscience/visionforge/solid/Solid.kt | 4 +- .../kscience/visionforge/solid/SolidGroup.kt | 2 +- .../visionforge/solid/SolidMaterial.kt | 8 +- .../visionforge/solid/SolidReference.kt | 31 +++--- .../solid/transform/RemoveSingleChild.kt | 2 +- .../visionforge/solid/PropertyTest.kt | 9 +- .../visionforge/solid/SerializationTest.kt | 4 +- visionforge-tables/build.gradle.kts | 4 +- .../visionforge/tables/VisionOfTableTest.kt | 2 +- visionforge-threejs/build.gradle.kts | 2 +- .../solid/three/MeshThreeFactory.kt | 7 +- .../solid/three/ThreeCanvasLabelFactory.kt | 3 +- .../solid/three/ThreeLineFactory.kt | 3 +- .../visionforge/solid/three/ThreeMaterials.kt | 17 +-- .../visionforge/solid/three/ThreePlugin.kt | 17 +-- .../solid/three/ThreeReferenceFactory.kt | 21 ++-- .../build.gradle.kts | 2 +- 77 files changed, 372 insertions(+), 314 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d02cd7c5..f2c4e6d5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.project") + id("space.kscience.gradle.project") // id("org.jetbrains.kotlinx.kover") version "0.5.0" } diff --git a/cern-root-loader/build.gradle.kts b/cern-root-loader/build.gradle.kts index fa26fab5..0ea3de8f 100644 --- a/cern-root-loader/build.gradle.kts +++ b/cern-root-loader/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } kscience{ diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 48a21ff1..a867f054 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -321,7 +321,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? } return if (group.children.isEmpty()) { null - } else if (group.items.size == 1 && group.properties.raw == null) { + } else if (group.items.size == 1 && group.properties.own == null) { group.items.values.first().apply { parent = null } } else { group diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index a6c3fb0a..39c82290 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -1,8 +1,8 @@ -import ru.mipt.npm.gradle.DependencyConfiguration -import ru.mipt.npm.gradle.FXModule +import space.kscience.gradle.DependencyConfiguration +import space.kscience.gradle.FXModule plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") application } @@ -36,7 +36,7 @@ kotlin { jvmMain { dependencies { implementation(project(":visionforge-fx")) - implementation("ch.qos.logback:logback-classic:1.2.5") + implementation("ch.qos.logback:logback-classic:1.2.11") } } jsMain { diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 0f74e9a8..723edb3b 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -6,7 +6,6 @@ import space.kscience.dataforge.names.Name import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Vision import space.kscience.visionforge.get -import space.kscience.visionforge.getPropertyValue import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.material @@ -20,7 +19,7 @@ class GDMLVisionTest { @Test fun testCubesStyles(){ val segment = cubes.children["composite-000.segment-0"] as Solid - println(segment.getPropertyValue(Vision.STYLE_KEY)) + println(segment.properties.getValue(Vision.STYLE_KEY)) // println(segment.computePropertyNode(SolidMaterial.MATERIAL_KEY)) // println(segment.computeProperty(SolidMaterial.MATERIAL_COLOR_KEY)) @@ -34,7 +33,7 @@ class GDMLVisionTest { fun testPrototypeProperty() { val child = cubes[Name.of("composite-000","segment-0")] assertNotNull(child) - child.setPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) - assertEquals("red", child.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).string) + child.properties.setValue(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) + assertEquals("red", child.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).string) } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index b28dec12..8f605ccd 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -26,6 +26,7 @@ import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.set import styled.css import styled.styledDiv @@ -56,7 +57,7 @@ val GDMLApp = fc("GDMLApp") { props -> console.info("Marking layers for file $name") markLayers() ambientLight { - color(Colors.white) + color.set(Colors.white) } } } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 1cd1b0ff..d4a80876 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -10,6 +10,7 @@ import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication import styled.injectGlobal @@ -46,7 +47,7 @@ private class GDMLDemoApp : Application { child(GDMLApp) { val vision = GdmlShowCase.cubes().toVision().apply { ambientLight { - color(Colors.white) + color.set(Colors.white) } } //println(context.plugins.fetch(VisionManager).encodeToString(vision)) diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index ccec7015..ada5841a 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.js") + id("space.kscience.gradle.js") } kscience{ diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index f3b1710c..ad37a7c2 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") application } diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 4bf18124..aeb0abd3 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -69,7 +69,7 @@ class Model(val manager: VisionManager) { fun reset() { map.values.forEach { - it.properties[SolidMaterial.MATERIAL_COLOR_KEY] = null + it.properties.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, null) } tracks.children.clear() } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 77ad5845..20a33fe2 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -25,6 +25,7 @@ import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.edges import styled.css @@ -57,7 +58,7 @@ val MMApp = fc("Muon monitor") { props -> props.model.root.apply { edges() ambientLight{ - color(Colors.white) + color.set(Colors.white) } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 17c3f149..9c96ad07 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -17,6 +17,7 @@ private class MMDemoApp : Application { val context = Context("MM-demo") { plugin(ThreePlugin) } + val visionManager = context.fetch(VisionManager) val model = Model(visionManager) diff --git a/demo/muon-monitor/src/jsMain/resources/index.html b/demo/muon-monitor/src/jsMain/resources/index.html index dbca2406..f9dee8bd 100644 --- a/demo/muon-monitor/src/jsMain/resources/index.html +++ b/demo/muon-monitor/src/jsMain/resources/index.html @@ -5,7 +5,6 @@ Three js demo for particle physics -
diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 267e4a82..e12b730f 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.jvm") + id("space.kscience.gradle.jvm") application } diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index bc391b9d..d3e03135 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -1,8 +1,8 @@ -import ru.mipt.npm.gradle.DependencyConfiguration -import ru.mipt.npm.gradle.FXModule +import space.kscience.gradle.DependencyConfiguration +import space.kscience.gradle.FXModule plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") application } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 4ddc185a..56221efb 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -4,7 +4,6 @@ import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.BoxGeometry import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.asValue -import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.asName @@ -43,13 +42,13 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision it.layers.enable(this@VariableBox.layer) } } - mesh.scale.z = meta[VALUE].number?.toDouble() ?: 1.0 + mesh.scale.z = properties.getValue(VALUE)?.number?.toDouble() ?: 1.0 //add listener to object properties onPropertyChange { name -> when { name == VALUE -> { - val value = meta[VALUE].int ?: 0 + val value = properties.getValue(VALUE)?.int ?: 0 val size = value.toFloat() / 255f * 20f mesh.scale.z = size.toDouble() mesh.position.z = size.toDouble() / 2 @@ -69,9 +68,9 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision } var value: Int - get() = meta[VALUE].int ?: 0 + get() = properties.getValue(VALUE)?.int ?: 0 set(value) { - setPropertyValue(VALUE, value.asValue()) + properties.setValue(VALUE, value.asValue()) } companion object { diff --git a/gradle.properties b/gradle.properties index 92f33679..aeb2ca21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.jupyter.add.scanner=false org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.11.8-kotlin-1.7.10 \ No newline at end of file +toolsVersion=0.12.0-kotlin-1.7.20-Beta \ No newline at end of file diff --git a/jupyter/build.gradle.kts b/jupyter/build.gradle.kts index 0b406250..45aaeaa3 100644 --- a/jupyter/build.gradle.kts +++ b/jupyter/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") id("org.jetbrains.kotlin.jupyter.api") } @@ -21,5 +21,5 @@ kotlin { } readme { - maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL + maturity = space.kscience.gradle.Maturity.EXPERIMENTAL } \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index 4a575602..3129de1e 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } description = "Jupyter api artifact for GDML rendering" @@ -56,5 +56,5 @@ kscience { } readme { - maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL + maturity = space.kscience.gradle.Maturity.EXPERIMENTAL } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 3ae9f6f9..4215d150 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,10 +15,10 @@ pluginManagement { } plugins { - id("ru.mipt.npm.gradle.project") version toolsVersion - id("ru.mipt.npm.gradle.mpp") version toolsVersion - id("ru.mipt.npm.gradle.jvm") version toolsVersion - id("ru.mipt.npm.gradle.js") version toolsVersion + id("space.kscience.gradle.project") version toolsVersion + id("space.kscience.gradle.mpp") version toolsVersion + id("space.kscience.gradle.jvm") version toolsVersion + id("space.kscience.gradle.js") version toolsVersion } } @@ -34,7 +34,7 @@ dependencyResolutionManagement { versionCatalogs { create("npmlibs") { - from("ru.mipt.npm:version-catalog:$toolsVersion") + from("space.kscience:version-catalog:$toolsVersion") } } } diff --git a/ui/bootstrap/build.gradle.kts b/ui/bootstrap/build.gradle.kts index b1b0588e..c0b980d9 100644 --- a/ui/bootstrap/build.gradle.kts +++ b/ui/bootstrap/build.gradle.kts @@ -1,6 +1,6 @@ plugins { kotlin("js") - id("ru.mipt.npm.gradle.js") + id("space.kscience.gradle.js") } val dataforgeVersion: String by rootProject.extra diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 0d4e2dc7..deb63381 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.bootstrap +import kotlinx.coroutines.GlobalScope import kotlinx.css.BorderStyle import kotlinx.css.Color import kotlinx.css.padding @@ -15,7 +16,6 @@ import react.RBuilder import react.dom.attrs import react.dom.button import react.fc -import space.kscience.dataforge.meta.withDefault import space.kscience.visionforge.Vision import space.kscience.visionforge.encodeToString import space.kscience.visionforge.react.flexColumn @@ -69,8 +69,8 @@ public val CanvasControls: FC = fc("CanvasControls") { prop } } propertyEditor( - ownProperties = props.canvasOptions.meta, - allProperties = props.canvasOptions.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), + scope = props.vision?.manager?.context ?: GlobalScope, + properties = props.canvasOptions.meta, descriptor = Canvas3DOptions.descriptor, expanded = false ) diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 4393565a..b82d48fe 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -3,13 +3,16 @@ package space.kscience.visionforge.bootstrap import org.w3c.dom.Element import react.RBuilder import react.dom.client.createRoot +import react.key import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.get import space.kscience.visionforge.Vision -import space.kscience.visionforge.computeProperties import space.kscience.visionforge.getStyle +import space.kscience.visionforge.react.EditorPropertyState +import space.kscience.visionforge.react.PropertyEditor import space.kscience.visionforge.react.metaViewer -import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.react.render +import space.kscience.visionforge.root import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.styles @@ -20,12 +23,25 @@ public fun RBuilder.visionPropertyEditor( ) { card("Properties") { - propertyEditor( - ownProperties = vision.meta, - allProperties = vision.computeProperties(), - descriptor = descriptor, - key = key - ) + child(PropertyEditor){ + attrs{ + this.key = key?.toString() + this.meta = vision.properties.root() + this.updates = vision.properties.changes + this.descriptor = descriptor + this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") + this.getPropertyState = {name-> + if(vision.properties.own?.get(name)!= null){ + EditorPropertyState.Defined + } else if(vision.properties.root()[name] != null){ + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } + } + } + } } val styles = if (vision is SolidReference) { (vision.styles + vision.prototype.styles).distinct() diff --git a/ui/react/build.gradle.kts b/ui/react/build.gradle.kts index d71dc6ac..1a58d333 100644 --- a/ui/react/build.gradle.kts +++ b/ui/react/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.js") + id("space.kscience.gradle.js") } dependencies{ diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 612fdfe6..fb339429 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -25,7 +25,7 @@ public val MultiSelectChooser: FC = fc("MultiSelectChooser") select { attrs { multiple = true - values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } + values = (props.meta.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } onChangeFunction = onChange } props.descriptor?.allowedValues?.forEach { optionValue -> diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 29c9b49e..4e94ef06 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -1,13 +1,18 @@ package space.kscience.visionforge.react +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.css.properties.TextDecoration import kotlinx.html.js.onClickFunction -import org.w3c.dom.Element import org.w3c.dom.events.Event import react.* import react.dom.attrs -import react.dom.client.createRoot import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.ValueRequirement @@ -19,17 +24,30 @@ import styled.styledButton import styled.styledDiv import styled.styledSpan +/** + * The display state of a property + */ +public sealed class EditorPropertyState { + public object Defined : EditorPropertyState() + public class Default(public val source: String = "unknown") : EditorPropertyState() + + public object Undefined : EditorPropertyState() + +} + + public external interface PropertyEditorProps : Props { /** * Root config object - always non-null */ - public var meta: ObservableMutableMeta + public var meta: MutableMeta - /** - * Provide default item (greyed out if used) - */ - public var withDefault: MetaProvider + public var getPropertyState: (Name) -> EditorPropertyState + + public var scope: CoroutineScope + + public var updates: Flow /** * Full path to the displayed node in [meta]. Could be empty @@ -54,7 +72,7 @@ private val PropertyEditorItem: FC = fc("PropertyEditorItem private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } val descriptor: MetaDescriptor? = useMemo(props.descriptor, props.name) { props.descriptor?.get(props.name) } - var ownProperty: ObservableMutableMeta by useState { props.meta.getOrCreate(props.name) } + var property: MutableMeta by useState { props.meta.getOrCreate(props.name) } val keys = useMemo(descriptor) { buildSet { @@ -70,17 +88,18 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { val token = props.name.lastOrNull()?.toString() ?: "Properties" fun update() { - ownProperty = props.meta.getOrCreate(props.name) + property = props.meta.getOrCreate(props.name) } useEffect(props.meta) { - props.meta.onChange(props) { updatedName -> + val job = props.updates.onEach { updatedName -> if (updatedName == props.name) { update() } - } + }.launchIn(props.scope) + cleanup { - props.meta.removeListener(props) + job.cancel() } } @@ -115,7 +134,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { styledSpan { css { +TreeStyles.treeLabel - if (ownProperty.isEmpty()) { + if (property.isEmpty()) { +TreeStyles.treeLabelInactive } } @@ -131,8 +150,8 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { ValueChooser { attrs { this.descriptor = descriptor - this.meta = ownProperty - this.actual = props.withDefault.getMeta(props.name) ?: ownProperty + this.meta = property + this.state = props.getPropertyState(props.name) } } } @@ -156,7 +175,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +"\u00D7" attrs { - if (ownProperty.isEmpty()) { + if (property.isEmpty()) { disabled = true } else { onClickFunction = removeClick @@ -179,9 +198,11 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { attrs { this.key = props.name.toString() this.meta = props.meta - this.withDefault = props.withDefault this.name = props.name + token this.descriptor = props.descriptor + this.scope = props.scope + this.getPropertyState = { props.getPropertyState(props.name + token) } + this.updates = props.updates } } //configEditor(props.root, props.name + token, props.descriptor, props.default) @@ -197,44 +218,51 @@ public val PropertyEditor: FC = fc("PropertyEditor") { prop attrs { this.key = "" this.meta = props.meta - this.withDefault = props.withDefault this.name = Name.EMPTY this.descriptor = props.descriptor this.expanded = props.expanded + this.scope = props.scope + this.getPropertyState = props.getPropertyState + this.updates = props.updates } } } +@OptIn(ExperimentalCoroutinesApi::class) public fun RBuilder.propertyEditor( - ownProperties: ObservableMutableMeta, - allProperties: MetaProvider = ownProperties, + scope: CoroutineScope, + properties: ObservableMutableMeta, descriptor: MetaDescriptor? = null, key: Any? = null, expanded: Boolean? = null, ) { child(PropertyEditor) { attrs { - this.meta = ownProperties - this.withDefault = allProperties + this.meta = properties this.descriptor = descriptor this.key = key?.toString() ?: "" this.expanded = expanded + this.scope = scope + this.getPropertyState = { name -> + if (properties[name] != null) { + EditorPropertyState.Defined + } else if (descriptor?.get(name)?.defaultValue != null) { + EditorPropertyState.Default("descriptor") + } else { + EditorPropertyState.Undefined + } + } + this.updates = callbackFlow { + properties.onChange(scope) { name -> + scope.launch { + send(name) + } + } + + invokeOnClose { + properties.removeListener(scope) + } + } } } -} - -public fun RBuilder.configEditor( - config: ObservableMutableMeta, - default: MetaProvider = config, - descriptor: MetaDescriptor? = null, - key: Any? = null, -): Unit = propertyEditor(config, default, descriptor, key = key) - -public fun Element.configEditor( - config: ObservableMutableMeta, - default: Meta = config, - descriptor: MetaDescriptor? = null, - key: Any? = null, -): Unit = createRoot(this).render { - configEditor(config, default, descriptor, key = key) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 382209c2..ae6386d9 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -20,7 +20,7 @@ import styled.styledInput @JsExport public val RangeValueChooser: FC = fc("RangeValueChooser") { props -> - var innerValue by useState(props.actual.double) + var innerValue by useState(props.meta.double) var rangeDisabled: Boolean by useState(props.meta.value == null) val handleDisable: (Event) -> Unit = { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 84f9347f..9866c30e 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -16,6 +16,7 @@ import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup +import space.kscience.visionforge.asSequence import space.kscience.visionforge.isEmpty import styled.css import styled.styledDiv @@ -59,9 +60,9 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { val obj = props.obj //display as node if any child is visible - if (obj is VisionGroup<*>) { + if (obj is VisionGroup) { flexRow { - if (obj.items.any { !it.key.body.startsWith("@") }) { + if (obj.children.keys.any { !it.body.startsWith("@") }) { styledSpan { css { +TreeStyles.treeCaret @@ -81,9 +82,9 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { css { +TreeStyles.tree } - obj.items.entries - .filter { !it.key.toString().startsWith("@") } // ignore statics and other hidden children - .sortedBy { (it.value as? VisionGroup<*>)?.isEmpty() ?: true } // ignore empty groups + obj.children.asSequence() + .filter { !it.first.toString().startsWith("@") } // ignore statics and other hidden children + .sortedBy { (it.second as? VisionGroup)?.children?.isEmpty() ?: true } // ignore empty groups .forEach { (childToken, child) -> styledDiv { css { @@ -92,7 +93,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { child(ObjectTree) { attrs { this.name = props.name + childToken - this.obj = child.vision + this.obj = child this.selected = props.selected this.clickCallback = props.clickCallback } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index cd769414..75cd3a0c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -27,13 +27,13 @@ import styled.styledSelect public external interface ValueChooserProps : Props { public var descriptor: MetaDescriptor? - public var meta: ObservableMutableMeta - public var actual: Meta + public var meta: MutableMeta + public var state: EditorPropertyState } @JsExport public val StringValueChooser: FC = fc("StringValueChooser") { props -> - var value by useState(props.actual.string ?: "") + var value by useState(props.meta.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { value = (event.target as HTMLInputElement).value @@ -67,7 +67,7 @@ public val BooleanValueChooser: FC = fc("BooleanValueChooser" } attrs { //this.attributes["indeterminate"] = (props.item == null).toString() - checked = props.actual.boolean ?: false + checked = props.meta.boolean ?: false onChangeFunction = handleChange } } @@ -75,7 +75,7 @@ public val BooleanValueChooser: FC = fc("BooleanValueChooser" @JsExport public val NumberValueChooser: FC = fc("NumberValueChooser") { props -> - var innerValue by useState(props.actual.string ?: "") + var innerValue by useState(props.meta.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { innerValue = (event.target as HTMLInputElement).value @@ -113,7 +113,7 @@ public val NumberValueChooser: FC = fc("NumberValueChooser") @JsExport public val ComboValueChooser: FC = fc("ComboValueChooser") { props -> - var selected by useState(props.actual.string ?: "") + var selected by useState(props.meta.string ?: "") val handleChange: (Event) -> Unit = { selected = (it.target as HTMLSelectElement).value props.meta.value = selected.asValue() @@ -128,7 +128,7 @@ public val ComboValueChooser: FC = fc("ComboValueChooser") { } } attrs { - this.value = props.actual.string ?: "" + this.value = props.meta.string ?: "" multiple = false onChangeFunction = handleChange } @@ -146,7 +146,7 @@ public val ColorValueChooser: FC = fc("ColorValueChooser") { margin(0.px) } attrs { - this.value = props.actual.value?.let { value -> + this.value = props.meta.value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) else value.string } ?: "#000000" diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 7d7564b5..aa168c11 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.js") + id("space.kscience.gradle.js") } val dataforgeVersion: String by rootProject.extra diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 085ff608..babafb2e 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -9,18 +9,19 @@ import react.dom.div import react.dom.span import ringui.* import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length -import space.kscience.visionforge.* -import space.kscience.visionforge.react.ThreeCanvasComponent -import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.flexRow -import space.kscience.visionforge.react.propertyEditor +import space.kscience.visionforge.Vision +import space.kscience.visionforge.react.* +import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.specifications.Canvas3DOptions +import space.kscience.visionforge.visionManager import styled.css import styled.styledDiv @@ -38,7 +39,7 @@ public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { } } -public fun ThreeCanvasWithControlsProps.options(block: Canvas3DOptions.() -> Unit){ +public fun ThreeCanvasWithControlsProps.options(block: Canvas3DOptions.() -> Unit) { options = Canvas3DOptions(block) } @@ -81,14 +82,14 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styled @JsExport public val ThreeCanvasWithControls: FC = fc("ThreeViewWithControls") { props -> - var selected by useState { props.selected } + var selected: Name? by useState { props.selected } var solid: Solid? by useState(null) useEffect { props.context.launch { solid = props.builderOfSolid.await() //ensure that the solid is properly rooted - if(solid?.parent == null){ + if (solid?.parent == null) { solid?.setAsRoot(props.context.visionManager) } } @@ -164,12 +165,25 @@ public val ThreeCanvasWithControls: FC = fc("Three nameCrumbs(selected) { selected = it } } IslandContent { - propertyEditor( - ownProperties = vision.properties(), - allProperties = vision.computeProperties(), - descriptor = vision.descriptor, - key = selected - ) + child(PropertyEditor) { + attrs { + this.key = selected.toString() + this.meta = vision.properties.root() + this.updates = vision.properties.changes + this.descriptor = vision.descriptor + this.scope = props.context + this.getPropertyState = { name -> + if (vision.properties.own?.get(name) != null) { + EditorPropertyState.Defined + } else if (vision.properties.root()[name] != null) { + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } + } + } + } } } } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt index 5c959184..b4ce3284 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt @@ -4,17 +4,16 @@ import org.w3c.dom.Element import react.RBuilder import react.dom.client.createRoot import react.dom.p +import react.key import ringui.Island import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.get import space.kscience.visionforge.Vision -import space.kscience.visionforge.computeProperties import space.kscience.visionforge.getStyle -import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.metaViewer -import space.kscience.visionforge.react.propertyEditor -import space.kscience.visionforge.react.render +import space.kscience.visionforge.react.* +import space.kscience.visionforge.root import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.styles @@ -31,12 +30,25 @@ public fun RBuilder.ringPropertyEditor( flexColumn { Island("Properties") { - propertyEditor( - ownProperties = vision.meta, - allProperties = vision.computeProperties(), - descriptor = descriptor, - key = key - ) + child(PropertyEditor) { + attrs { + this.key = key?.toString() + this.meta = vision.properties.root() + this.updates = vision.properties.changes + this.descriptor = descriptor + this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") + this.getPropertyState = {name-> + if(vision.properties.own?.get(name)!= null){ + EditorPropertyState.Defined + } else if(vision.properties.root()[name] != null){ + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } + } + } + } } if (styles.isNotEmpty()) { diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 68cc13b2..1b62bd1f 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.ring +import kotlinx.coroutines.GlobalScope import kotlinx.css.BorderStyle import kotlinx.css.Color import kotlinx.css.padding @@ -18,7 +19,6 @@ import react.fc import ringui.Island import ringui.SmartTabs import ringui.Tab -import space.kscience.dataforge.meta.withDefault import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.encodeToString @@ -75,8 +75,8 @@ internal val CanvasControls: FC = fc("CanvasControls") { pr } } propertyEditor( - ownProperties = props.options.meta, - allProperties = props.options.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), + scope = props.vision?.manager?.context ?: GlobalScope, + properties = props.options.meta, descriptor = Canvas3DOptions.descriptor, expanded = false ) diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 227c80dc..d9bf251c 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } val dataforgeVersion: String by rootProject.extra @@ -28,5 +28,5 @@ kscience{ } readme{ - maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT + maturity = space.kscience.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 9fc148b3..1c05d6d6 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -13,7 +13,7 @@ import kotlin.jvm.JvmInline @JvmInline public value class StyleSheet(private val owner: Vision) { - private val styleNode: Meta get() = owner.properties[STYLESHEET_KEY] + private val styleNode: Meta get() = owner.properties.getProperty(STYLESHEET_KEY) public val items: Map get() = styleNode.items @@ -23,7 +23,7 @@ public value class StyleSheet(private val owner: Vision) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.properties[STYLESHEET_KEY + key] = style + owner.properties.setProperty(STYLESHEET_KEY + key, style) } /** @@ -86,7 +86,7 @@ public val Vision.styleSheet: StyleSheet get() = StyleSheet(this) * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String) { - styles = (properties.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name + styles = (properties.own?.get(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name } @@ -94,7 +94,7 @@ public fun Vision.useStyle(name: String) { * Resolve a style with given name for given [Vision]. The style is not necessarily applied to this [Vision]. */ public fun Vision.getStyle(name: String): Meta? = - properties.raw?.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + properties.own?.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) /** * Resolve a property from all styles diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 9b8304de..a8b590e7 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.Described @@ -30,7 +30,7 @@ public interface Vision : Described { /** * Owner [VisionManager]. Used to define coroutine scope a serialization */ - public val manager: VisionManager get() = parent?.manager ?: Global.visionManager + public val manager: VisionManager? get() = parent?.manager public val properties: MutableVisionProperties @@ -67,13 +67,17 @@ public var Vision.visible: Boolean? /** * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled */ -public fun Vision.onPropertyChange(callback: (Name) -> Unit): Job = properties.changes.onEach { +public fun Vision.onPropertyChange( + scope: CoroutineScope? = manager?.context, + callback: (Name) -> Unit +): Job = properties.changes.onEach { callback(it) -}.launchIn(manager.context) +}.launchIn(scope ?: error("Orphan Vision can't observe properties")) public fun V.useProperty( property: KProperty1, + scope: CoroutineScope? = manager?.context, callBack: V.(T) -> Unit, ): Job { //Pass initial value. @@ -82,5 +86,5 @@ public fun V.useProperty( if (name.startsWith(property.name.asName())) { callBack(property.get(this@useProperty)) } - }.launchIn(manager.context) + }.launchIn(scope ?: error("Orphan Vision can't observe properties")) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index d0a7ec70..0e3a8dc1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -91,8 +91,8 @@ private fun CoroutineScope.collectChange( ) { //Collect properties change - source.onPropertyChange { propertyName -> - val newItem = source.properties.raw?.get(propertyName) + source.onPropertyChange(this) { propertyName -> + val newItem = source.properties.own?.get(propertyName) collector().propertyChanged(name, propertyName, newItem) } @@ -118,8 +118,8 @@ private fun CoroutineScope.collectChange( */ public fun Vision.flowChanges( collectionDuration: Duration, - manager: VisionManager = this.manager, ): Flow = flow { + val manager = manager?: error("Orphan vision could not collect changes") var collector = VisionChangeBuilder(manager) coroutineScope { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 529c01a1..481a53ce 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -124,7 +124,7 @@ internal abstract class VisionChildrenImpl( return items!! } - private val scope: CoroutineScope get() = group.manager.context + private val scope: CoroutineScope? get() = group.manager?.context override val keys: Set get() = items?.keys ?: emptySet() @@ -134,7 +134,7 @@ internal abstract class VisionChildrenImpl( override val changes: SharedFlow get() = _changes private fun onChange(name: Name) { - scope.launch { + scope?.launch { _changes.emit(name) } } @@ -158,7 +158,7 @@ internal abstract class VisionChildrenImpl( //set parent value.parent = group //start update jobs (only if the vision is rooted) - scope.let { scope -> + scope?.let { scope -> val job = value.children?.changes?.onEach { onChange(token + it) }?.launchIn(scope) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 3428dd33..a6f1a7c6 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -107,7 +107,8 @@ public abstract class VisionPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(met */ public val Context.visionManager: VisionManager get() = fetch(VisionManager) -public fun Vision.encodeToString(): String = manager.encodeToString(this) +public fun Vision.encodeToString(): String = + manager?.encodeToString(this) ?: error("Orphan vision could not be encoded") /** * A root vision attached to [VisionManager] diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 7b6c6e7b..693e85bf 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,5 +1,7 @@ package space.kscience.visionforge +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow @@ -16,14 +18,14 @@ public interface VisionProperties { /** * Raw Visions own properties without styles, defaults, etc. */ - public val raw: Meta? + public val own: Meta? public val descriptor: MetaDescriptor? public fun getValue( name: Name, - inherit: Boolean, - includeStyles: Boolean, + inherit: Boolean? = null, + includeStyles: Boolean? = null, ): Value? /** @@ -31,10 +33,10 @@ public interface VisionProperties { * @param inherit toggles parent node property lookup. Null means inference from descriptor. * @param includeStyles toggles inclusion of properties from styles. */ - public operator fun get( + public fun getProperty( name: Name, - inherit: Boolean, - includeStyles: Boolean, + inherit: Boolean? = null, + includeStyles: Boolean? = null, ): Meta public val changes: Flow @@ -48,10 +50,10 @@ public interface VisionProperties { public interface MutableVisionProperties : VisionProperties { - override operator fun get( + override fun getProperty( name: Name, - inherit: Boolean, - includeStyles: Boolean, + inherit: Boolean?, + includeStyles: Boolean?, ): MutableMeta = VisionPropertiesItem( this, name, @@ -60,7 +62,7 @@ public interface MutableVisionProperties : VisionProperties { ) - public operator fun set( + public fun setProperty( name: Name, node: Meta?, ) @@ -84,7 +86,7 @@ private class VisionPropertiesItem( override val items: Map get() { - val metaKeys = properties.raw?.getMeta(nodeName)?.items?.keys ?: emptySet() + val metaKeys = properties.own?.getMeta(nodeName)?.items?.keys ?: emptySet() val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() val defaultKeys = default?.get(nodeName)?.items?.keys ?: emptySet() val inheritFlag = descriptor?.inherited ?: inherit @@ -119,7 +121,7 @@ private class VisionPropertiesItem( ) override fun setMeta(name: Name, node: Meta?) { - properties[nodeName + name] = node + properties.setProperty(nodeName + name, node) } override fun toString(): String = Meta.toString(this) @@ -131,11 +133,10 @@ public abstract class AbstractVisionProperties( private val vision: Vision, ) : MutableVisionProperties { override val descriptor: MetaDescriptor? get() = vision.descriptor - protected val default: Meta? get() = descriptor?.defaultNode protected abstract var properties: MutableMeta? - override val raw: Meta? get() = properties + override val own: Meta? get() = properties @Synchronized protected fun getOrCreateProperties(): MutableMeta { @@ -149,20 +150,24 @@ public abstract class AbstractVisionProperties( override fun getValue( name: Name, - inherit: Boolean, - includeStyles: Boolean, + inherit: Boolean?, + includeStyles: Boolean?, ): Value? { - raw?.get(name)?.value?.let { return it } - if (includeStyles) { + val descriptor = descriptor?.get(name) + val inheritFlag = inherit ?: descriptor?.inherited ?: false + val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true + + own?.get(name)?.value?.let { return it } + if (stylesFlag) { vision.getStyleProperty(name)?.value?.let { return it } } - if (inherit) { + if (inheritFlag) { vision.parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } } - return default?.get(name)?.value + return descriptor?.defaultValue } - override fun set(name: Name, node: Meta?) { + override fun setProperty(name: Name, node: Meta?) { //TODO check old value? if (name.isEmpty()) { properties = node?.asMutableMeta() @@ -188,6 +193,7 @@ public abstract class AbstractVisionProperties( private val _changes = MutableSharedFlow(10) override val changes: SharedFlow get() = _changes + @OptIn(DelicateCoroutinesApi::class) override fun invalidate(propertyName: Name) { if (propertyName == Vision.STYLE_KEY) { vision.styles.asSequence() @@ -198,85 +204,46 @@ public abstract class AbstractVisionProperties( invalidate(it.key.asName()) } } - vision.manager.context.launch { + (vision.manager?.context ?: GlobalScope).launch { _changes.emit(propertyName) } } } -public fun VisionProperties.getValue( - name: Name, - inherit: Boolean? = null, - includeStyles: Boolean? = null, -): Value? { - val descriptor = descriptor?.get(name) - val inheritFlag = inherit ?: descriptor?.inherited ?: false - val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true - return getValue(name, inheritFlag, stylesFlag) -} - public fun VisionProperties.getValue( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, ): Value? = getValue(name.parseAsName(), inherit, includeStyles) -/** - * Compute the property based on the provided value descriptor. By default, use Vision own descriptor - */ -public operator fun VisionProperties.get( - name: Name, - inherit: Boolean? = null, - includeStyles: Boolean? = null, -): Meta { - val descriptor: MetaDescriptor? = descriptor?.get(name) - val inheritFlag = inherit ?: descriptor?.inherited ?: false - val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true - return get(name, inheritFlag, stylesFlag) -} - - /** * Get [Vision] property using key as a String */ -public operator fun VisionProperties.get( +public fun VisionProperties.getProperty( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, -): Meta = get(name.parseAsName(), inherit, includeStyles) - - -/** - * Compute the property based on the provided value descriptor. By default, use Vision own descriptor - */ -public operator fun MutableVisionProperties.get( - name: Name, - inherit: Boolean? = null, - includeStyles: Boolean? = null, -): MutableMeta { - val descriptor: MetaDescriptor? = descriptor?.get(name) - val inheritFlag = inherit ?: descriptor?.inherited ?: false - val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true - return get(name, inheritFlag, stylesFlag) -} +): Meta = getProperty(name.parseAsName(), inherit, includeStyles) /** * The root property node with given inheritance and style flags + * @param inherit - inherit properties from the [Vision] parent. If null, infer from descriptor + * @param includeStyles - include style information. If null, infer from descriptor */ public fun MutableVisionProperties.root( inherit: Boolean? = null, includeStyles: Boolean? = null, -): MutableMeta = get(Name.EMPTY, inherit, includeStyles) +): MutableMeta = getProperty(Name.EMPTY, inherit, includeStyles) /** * Get [Vision] property using key as a String */ -public operator fun MutableVisionProperties.get( +public fun MutableVisionProperties.getProperty( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, -): MutableMeta = get(name.parseAsName(), inherit, includeStyles) +): MutableMeta = getProperty(name.parseAsName(), inherit, includeStyles) public operator fun MutableVisionProperties.set(name: Name, value: Number): Unit = diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt index 19106240..3a818b08 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt @@ -9,7 +9,7 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.* //TODO replace by something -internal val Vision.mutableProperties get() = properties[Name.EMPTY, false, false] +internal val Vision.mutableProperties get() = properties.getProperty(Name.EMPTY, false, false) @Serializable public abstract class VisionOfHtmlInput : AbstractVision() { diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index d6128963..f72fe2bf 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -54,7 +54,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - vision.properties.raw?.items?.forEach { + vision.properties.own?.items?.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 23517112..e7a35faa 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.meta import space.kscience.dataforge.meta.* import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.get +import space.kscience.visionforge.getProperty import space.kscience.visionforge.getValue import space.kscience.visionforge.set import kotlin.test.Test @@ -30,7 +30,7 @@ internal class VisionPropertyTest { @Test fun testPropertyEdit() { val vision = VisionGroup() - vision.properties["fff.ddd"].apply { + vision.properties.getProperty("fff.ddd").apply { value = 2.asValue() } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) @@ -40,7 +40,7 @@ internal class VisionPropertyTest { @Test fun testPropertyUpdate() { val vision = VisionGroup() - vision.properties["fff"].updateWith(TestScheme) { + vision.properties.getProperty("fff").updateWith(TestScheme) { ddd = 2 } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index e9425afb..41018759 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -115,7 +115,7 @@ public class VisionClient : AbstractPlugin() { onopen = { feedbackJob = vision.flowChanges( - feedbackAggregationTime.milliseconds + feedbackAggregationTime.milliseconds, ).onEach { change -> send(visionManager.encodeToString(change)) }.launchIn(visionManager.context) diff --git a/visionforge-fx/build.gradle.kts b/visionforge-fx/build.gradle.kts index 26fa13c8..464c7af3 100644 --- a/visionforge-fx/build.gradle.kts +++ b/visionforge-fx/build.gradle.kts @@ -1,12 +1,12 @@ plugins { - id("ru.mipt.npm.gradle.jvm") + id("space.kscience.gradle.jvm") } val dataforgeVersion: String by rootProject.extra val fxVersion: String by rootProject.extra kscience{ - useFx(ru.mipt.npm.gradle.FXModule.CONTROLS, version = fxVersion) + useFx(space.kscience.gradle.FXModule.CONTROLS, version = fxVersion) } dependencies { @@ -15,12 +15,12 @@ dependencies { api("org.fxyz3d:fxyz3d:0.5.4") { exclude(module = "slf4j-simple") } - api("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:${ru.mipt.npm.gradle.KScienceVersions.coroutinesVersion}") + api("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") implementation("eu.mihosoft.vrl.jcsg:jcsg:0.5.7") { exclude(module = "slf4j-simple") } } readme{ - maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE + maturity = space.kscience.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index bac388ee..d39f284c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -16,7 +16,6 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.misc.Type -import space.kscience.visionforge.get import space.kscience.visionforge.solid.FX3DFactory.Companion.TYPE import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_WIREFRAME_KEY @@ -77,7 +76,7 @@ public class FX3DPlugin : AbstractPlugin() { is PolyLine -> PolyLine3D( obj.points.map { Point3D(it.x, it.y, it.z) }, obj.thickness.toFloat(), - obj.properties.get(SolidMaterial.MATERIAL_COLOR_KEY).color() + obj.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).color() ).apply { this.meshView.cullFace = CullFace.FRONT } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 8d3e2836..2eb2255c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -6,7 +6,6 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision -import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange import tornadofx.* @@ -35,7 +34,7 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi public operator fun get(key: Name): ObjectBinding { return bindings.getOrPut(key) { object : ObjectBinding() { - override fun computeValue(): Meta = obj.properties[key] + override fun computeValue(): Meta = obj.properties.getProperty(key) } } } diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 1e9b59b9..345445da 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } kotlin { @@ -13,5 +13,10 @@ kotlin { api("space.kscience:gdml:0.4.0") } } + jvmTest{ + dependencies{ + implementation("ch.qos.logback:logback-classic:1.2.11") + } + } } } \ No newline at end of file diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt index b2dbce57..7af53964 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/markLayers.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.gdml +import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.info import space.kscience.dataforge.context.logger import space.kscience.dataforge.names.Name @@ -50,7 +51,7 @@ private fun VisionCounterTree.topToBottom(): Sequence = seque } public fun SolidGroup.markLayers(thresholds: List = listOf(500, 1000, 20000, 50000)) { - val logger = manager.context.logger + val logger = manager?.context?.logger ?: Global.logger val counterTree = VisionCounterTree(Name.EMPTY, this, hashMapOf()) val totalCount = counterTree.childrenCount if (totalCount > (thresholds.firstOrNull() ?: 0)) { diff --git a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt index 948ad214..a30cf863 100644 --- a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt +++ b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt @@ -26,7 +26,7 @@ class TestCubes { val smallBoxPrototype = vision.getPrototype(Name.parse("solids.smallBox")) as? Box assertNotNull(smallBoxPrototype) assertEquals(30.0, smallBoxPrototype.xSize.toDouble()) - val smallBoxVision = vision.children["composite-111.smallBox"]?.unref as? Box + val smallBoxVision = vision.children["composite-111.smallBox"]?.prototype as? Box assertNotNull(smallBoxVision) assertEquals(30.0, smallBoxVision.xSize.toDouble()) } diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 1a8e4efd..2909ab6d 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } val markdownVersion = "0.2.4" diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index 1c1ed308..919dde07 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } val plotlyVersion = "0.5.3-dev-1" diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index c23de631..2e89dbf5 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -16,7 +16,7 @@ import space.kscience.visionforge.root public class VisionOfPlotly private constructor() : AbstractVision() { public constructor(plot: Plot) : this() { - properties[Name.EMPTY] = plot.meta + properties.setProperty(Name.EMPTY, plot.meta) } public val plot: Plot get() = Plot(properties.root().asObservable()) diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index a89f2d07..236dda78 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.jvm") + id("space.kscience.gradle.jvm") } val ktorVersion = npmlibs.versions.ktor.get() diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index bb88fa22..d4bf939f 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -92,6 +92,7 @@ public class VisionServer internal constructor( header() } title(title) + consumer.header() } body { //Load the fragment and remember all loaded visions diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index ce669659..f794afe4 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } kscience{ @@ -20,9 +20,14 @@ kotlin { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4") } } + jvmTest{ + dependencies{ + implementation("ch.qos.logback:logback-classic:1.2.11") + } + } } } readme{ - maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT + maturity = space.kscience.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index dde24ef0..29de1575 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -29,7 +29,7 @@ public class ColorAccessor( } public fun Vision.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> - ColorAccessor(properties.root(), property.name.asName()) + ColorAccessor(properties.root(true), property.name.asName()) } public var ColorAccessor?.string: String? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index f30c641b..fb1b4774 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -33,7 +33,7 @@ public inline fun MutableVisionContainer.composite( } val res = Composite(type, children[0], children[1]) - res.properties[Name.EMPTY] = group.properties.raw + res.properties.setProperty(Name.EMPTY, group.properties.own) set(name, res) return res @@ -49,7 +49,7 @@ public fun SolidGroup.smartComposite( @VisionBuilder builder: SolidGroup.() -> Unit, ): Solid = if (type == CompositeType.GROUP) { val group = SolidGroup(builder) - if (name == null && group.properties.raw == null) { + if (name == null && group.properties.own == null) { //append directly to group if no properties are defined group.items.forEach { (_, value) -> value.parent = null diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 0b1c2e20..68eded95 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -107,7 +107,7 @@ public class ExtrudeBuilder( } internal fun build(): Extruded = Extruded(shape, layers).apply { - this.properties[Name.EMPTY] = this@ExtrudeBuilder.properties + this.properties.setProperty(Name.EMPTY, this@ExtrudeBuilder.properties) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index df28b344..587e803c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -10,7 +10,7 @@ import space.kscience.visionforge.* public class PolyLine(public val points: List) : SolidBase() { //var lineType by string() - public var thickness: Number by properties[SolidMaterial.MATERIAL_KEY].number { 1.0 } + public var thickness: Number by properties.getProperty(SolidMaterial.MATERIAL_KEY).number { 1.0 } } @VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index d932a4b3..2283f187 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -170,7 +170,7 @@ internal fun float(name: Name, default: Number): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { - val item = thisRef.properties.raw?.get(name) ?: return null + val item = thisRef.properties.own?.get(name) ?: return null return object : Point3D { override val x: Float get() = item[X_KEY]?.float ?: default override val y: Float get() = item[Y_KEY]?.float ?: default @@ -180,7 +180,7 @@ internal fun point(name: Name, default: Float): ReadWriteProperty, value: Point3D?) { if (value == null) { - thisRef.properties[name] = null + thisRef.properties.setProperty(name, null) } else { thisRef.properties[name + X_KEY] = value.x thisRef.properties[name + Y_KEY] = value.y diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index e514dee4..80a1129d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -54,7 +54,7 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable * If prototype is a ref, then it is unfolded automatically. */ override fun getPrototype(name: Name): Solid? = - prototypes?.get(name)?.unref ?: (parent as? PrototypeHolder)?.getPrototype(name) + prototypes?.get(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name) /** * Create or edit prototype node as a group diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index e8da3499..7d5c4d00 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -99,15 +99,15 @@ public class SolidMaterial : Scheme() { } public val Solid.color: ColorAccessor - get() = ColorAccessor(properties.root(), MATERIAL_COLOR_KEY) + get() = ColorAccessor(properties.root(true), MATERIAL_COLOR_KEY) public var Solid.material: SolidMaterial? - get() = SolidMaterial.read(properties[MATERIAL_KEY]) - set(value) = properties.set(MATERIAL_KEY, value?.meta) + get() = SolidMaterial.read(properties.getProperty(MATERIAL_KEY)) + set(value) = properties.setProperty(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - properties[MATERIAL_KEY].updateWith(SolidMaterial, builder) + properties.getProperty(MATERIAL_KEY).updateWith(SolidMaterial, builder) } public var Solid.opacity: Number? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index e071d07b..51e0bc6b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -16,9 +16,10 @@ import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD * Get a vision prototype if it is a [SolidReference] or vision itself if it is not. * Unref is recursive, so it always returns a non-reference. */ -public val Vision.unref: Solid +public val Vision.prototype: Solid get() = when (this) { - is SolidReference -> prototype.unref + is SolidReference -> prototype.prototype + is SolidReferenceChild -> prototype.prototype is Solid -> this else -> error("This Vision is neither Solid nor SolidReference") } @@ -55,13 +56,13 @@ public class SolidReference( propertiesInternal = value } - override val raw: Meta? get() = properties + override val own: Meta? get() = properties - override fun get(name: Name, inherit: Boolean, includeStyles: Boolean): MutableMeta { - return properties?.getMeta(name) ?: prototype.properties.get(name, inherit, includeStyles) + override fun getProperty(name: Name, inherit: Boolean?, includeStyles: Boolean?): MutableMeta { + return properties?.getMeta(name) ?: prototype.properties.getProperty(name, inherit, includeStyles) } - override fun getValue(name: Name, inherit: Boolean, includeStyles: Boolean): Value? { + override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { return properties?.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) } } @@ -105,23 +106,23 @@ internal class SolidReferenceChild( override val properties: MutableVisionProperties = object : MutableVisionProperties { override val descriptor: MetaDescriptor get() = this@SolidReferenceChild.descriptor - override val raw: MutableMeta by lazy { owner.properties[childToken(childName).asName()] } + override val own: MutableMeta by lazy { owner.properties.getProperty(childToken(childName).asName()) } - override fun get(name: Name, inherit: Boolean, includeStyles: Boolean): MutableMeta = - raw.getMeta(name) ?: prototype.properties.get(name, inherit, includeStyles) + override fun getProperty(name: Name, inherit: Boolean?, includeStyles: Boolean?): MutableMeta = + own.getMeta(name) ?: prototype.properties.getProperty(name, inherit, includeStyles) override fun getValue( name: Name, - inherit: Boolean, - includeStyles: Boolean, - ): Value? = raw.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) + inherit: Boolean?, + includeStyles: Boolean?, + ): Value? = own.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) - override fun set(name: Name, node: Meta?) { - raw.setMeta(name, node) + override fun setProperty(name: Name, node: Meta?) { + own.setMeta(name, node) } override fun setValue(name: Name, value: Value?) { - raw.setValue(name, value) + own.setValue(name, value) } override val changes: Flow get() = owner.properties.changes.filter { it.startsWith(childToken(childName)) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index dbdc58ec..dc01e749 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -20,7 +20,7 @@ internal fun Solid.updateFrom(other: Solid): Solid { scaleX *= other.scaleX scaleY *= other.scaleY scaleZ *= other.scaleZ - properties[Name.EMPTY] = other.properties.root() + properties.setProperty(Name.EMPTY, other.properties.root()) return this } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index 2eb4c65d..5e26284e 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.solid import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.withTimeout import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.asName @@ -26,13 +25,13 @@ class PropertyTest { @OptIn(ExperimentalCoroutinesApi::class) @Test - fun testColorUpdate() = runTest { + fun testColorUpdate() = runTest(dispatchTimeoutMs = 200) { val box = Box(10.0f, 10.0f, 10.0f) val c = CompletableDeferred() - box.onPropertyChange { + val subscription = box.onPropertyChange(this) { if (it == SolidMaterial.MATERIAL_COLOR_KEY) { c.complete(box.color.string) } @@ -42,8 +41,8 @@ class PropertyTest { color.set("pink") } - assertEquals("pink", withTimeout(50) { c.await() }) - + assertEquals("pink", c.await()) + subscription.cancel() } @Test diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index baad6110..c2dee067 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -31,7 +31,7 @@ class SerializationTest { val string = Solids.encodeToString(cube) println(string) val newCube = Solids.decodeFromString(string) - assertEquals(cube.properties.raw, newCube.properties.raw) + assertEquals(cube.properties.own, newCube.properties.own) } @Test @@ -52,7 +52,7 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group.children["cube"]?.properties?.raw, reconstructed.children["cube"]?.properties?.raw) + assertEquals(group.children["cube"]?.properties?.own, reconstructed.children["cube"]?.properties?.own) } @Test diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index d4e86bf1..55cc27e5 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } val tablesVersion = "0.2.0-dev-3" @@ -36,5 +36,5 @@ kotlin { } readme{ - maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE + maturity = space.kscience.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt index e3b199d1..e1210ffa 100644 --- a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -17,7 +17,7 @@ internal class VisionOfTableTest { val x by ColumnHeader.typed() val y by ColumnHeader.typed() - val table = ColumnTable(100) { + val table = ColumnTable(100) { x.fill { it.asValue() } y.values = x.values.map { it?.double?.pow(2)?.asValue() } } diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index f0462837..d9d0f96d 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.js") + id("space.kscience.gradle.js") } kotlin{ diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 04f192fd..9309848f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -10,7 +10,6 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.set import space.kscience.visionforge.solid.Solid @@ -78,7 +77,7 @@ public abstract class MeshThreeFactory( @VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { properties.set(EDGES_ENABLED_KEY, enabled) - SolidMaterial.write(properties[EDGES_MATERIAL_KEY]).apply(block) + SolidMaterial.write(properties.getProperty(EDGES_MATERIAL_KEY)).apply(block) } internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { @@ -94,9 +93,9 @@ internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { public fun Mesh.applyEdges(obj: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.properties.get(EDGES_ENABLED_KEY, inherit = true).boolean != false) { + if (obj.properties.getProperty(EDGES_ENABLED_KEY, inherit = true).boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return - val material = ThreeMaterials.getLineMaterial(obj.properties[EDGES_MATERIAL_KEY], true) + val material = ThreeMaterials.getLineMaterial(obj.properties.getProperty(EDGES_MATERIAL_KEY), true) if (edges == null) { add( LineSegments( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 8108389e..d33c7e79 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -11,7 +11,6 @@ import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.CanvasTextBaseline import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.MIDDLE -import space.kscience.visionforge.get import space.kscience.visionforge.solid.SolidLabel import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG @@ -27,7 +26,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.properties[SolidMaterial.MATERIAL_COLOR_KEY].value ?: "black" + context.fillStyle = obj.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index 70938e99..fcd92b7c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,7 +4,6 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments -import space.kscience.visionforge.get import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial @@ -25,7 +24,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - obj.properties[SolidMaterial.MATERIAL_KEY], + obj.properties.getProperty(SolidMaterial.MATERIAL_KEY), false ) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index a9f68f69..20bd7f3a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -10,7 +10,9 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.visionforge.* +import space.kscience.visionforge.Colors +import space.kscience.visionforge.Vision +import space.kscience.visionforge.getStyleNodes import space.kscience.visionforge.solid.ColorAccessor import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.SolidReference @@ -129,15 +131,15 @@ private var Material.cached: Boolean } public fun Mesh.updateMaterial(vision: Vision) { - val ownMaterialMeta = vision.properties.raw?.get(SolidMaterial.MATERIAL_KEY) + val ownMaterialMeta = vision.properties.own?.get(SolidMaterial.MATERIAL_KEY) if (ownMaterialMeta == null) { if (vision is SolidReference && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty()) { updateMaterial(vision.prototype) } else { - material = ThreeMaterials.cacheMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]) + material = ThreeMaterials.cacheMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)) } } else { - material = ThreeMaterials.buildMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]) + material = ThreeMaterials.buildMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)) } } @@ -152,15 +154,16 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { - material.asDynamic().color = vision.properties[SolidMaterial.MATERIAL_COLOR_KEY].threeColor() + material.asDynamic().color = vision.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.SPECULAR_COLOR_KEY -> { - material.asDynamic().specular = vision.properties[SolidMaterial.SPECULAR_COLOR_KEY].threeColor() + material.asDynamic().specular = vision.properties.getProperty(SolidMaterial.SPECULAR_COLOR_KEY).threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { - material.asDynamic().emissive = vision.properties[SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY].threeColor() + material.asDynamic().emissive = vision.properties.getProperty(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY) + .threeColor() ?: ThreeMaterials.BLACK_COLOR } SolidMaterial.MATERIAL_OPACITY_KEY -> { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 03ed5ee4..2fe9585c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.Object3D +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* @@ -9,7 +11,6 @@ import space.kscience.dataforge.meta.update import space.kscience.dataforge.names.* import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision -import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -48,11 +49,11 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public fun buildObject3D(obj: Solid): Object3D = when (obj) { is ThreeJsVision -> obj.render(this) - is SolidReferenceGroup -> ThreeReferenceFactory.build(this, obj) + is SolidReference -> ThreeReferenceFactory.build(this, obj) is SolidGroup -> { val group = ThreeGroup() obj.items.forEach { (token, child) -> - if (child is Solid && token != SolidGroup.PROTOTYPES_TOKEN && child.ignore != true) { + if (token != SolidGroup.PROTOTYPES_TOKEN && child.ignore != true) { try { val object3D = buildObject3D(child) group[token] = object3D @@ -67,7 +68,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { updatePosition(obj) //obj.onChildrenChange() - obj.onPropertyChange { name -> + obj.properties.changes.onEach { name -> if ( name.startsWith(Solid.POSITION_KEY) || name.startsWith(Solid.ROTATION_KEY) || @@ -78,10 +79,10 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } else if (name == Vision.VISIBLE_KEY) { visible = obj.visible ?: true } - } + }.launchIn(context) - obj.onStructureChanged(this){ childName -> - val child = get(childName) + obj.children.changes.onEach { childName -> + val child = obj.children[childName] //removing old object findChild(childName)?.let { oldChild -> @@ -97,7 +98,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { logger.error(ex) { "Failed to render $child" } } } - } + }.launchIn(context) } } is Composite -> compositeFactory.build(this, obj) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 8e667dcb..27657931 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -7,20 +7,21 @@ import space.kscience.dataforge.names.cutFirst import space.kscience.dataforge.names.firstOrNull import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidReferenceGroup -import space.kscience.visionforge.solid.SolidReferenceGroup.Companion.REFERENCE_CHILD_PROPERTY_PREFIX +import space.kscience.visionforge.solid.SolidReference +import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX import kotlin.reflect.KClass -public object ThreeReferenceFactory : ThreeFactory { +public object ThreeReferenceFactory : ThreeFactory { private val cache = HashMap() - override val type: KClass = SolidReferenceGroup::class + override val type: KClass = SolidReference::class private fun Object3D.replicate(): Object3D { return when (this) { is Mesh -> Mesh(geometry, material).also { it.applyMatrix4(matrix) } + else -> clone(false) }.also { obj: Object3D -> obj.name = this.name @@ -30,7 +31,7 @@ public object ThreeReferenceFactory : ThreeFactory { } } - override fun build(three: ThreePlugin, obj: SolidReferenceGroup): Object3D { + override fun build(three: ThreePlugin, obj: SolidReference): Object3D { val template = obj.prototype val cachedObject = cache.getOrPut(template) { three.buildObject3D(template) @@ -39,18 +40,20 @@ public object ThreeReferenceFactory : ThreeFactory { val object3D: Object3D = cachedObject.replicate() object3D.updatePosition(obj) - if(object3D is Mesh){ + if (object3D is Mesh) { //object3D.material = ThreeMaterials.buildMaterial(obj.getProperty(SolidMaterial.MATERIAL_KEY).node!!) object3D.applyProperties(obj) } //TODO apply child properties - obj.onPropertyChange { name-> + obj.onPropertyChange { name -> if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { - val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") + val childName = name.firstOrNull()?.index?.let(Name::parse) + ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() - val referenceChild = obj.children[childName] ?: error("Reference child with name '$childName' not found") + val referenceChild = + obj.children[childName] ?: error("Reference child with name '$childName' not found") val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") child.updateProperty(referenceChild, propertyName) } else { diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 67e12b10..399eb5b0 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("ru.mipt.npm.gradle.mpp") + id("space.kscience.gradle.mpp") } val ktorVersion: String by rootProject.extra -- 2.34.1 From ecf4a6a198133c620f9654b3703754a25fc70b82 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 13 Aug 2022 12:45:10 +0300 Subject: [PATCH 082/143] Add property flows --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 4 +- .../visionforge/gdml/GDMLVisionTest.kt | 4 +- demo/muon-monitor/build.gradle.kts | 1 + .../visionforge/solid/demo/VisionLayout.kt | 3 + .../kscience/visionforge/solid/demo/demo.kt | 2 + .../visionforge/solid/demo/ThreeDemoGrid.kt | 3 + .../visionforge/solid/demo/VariableBox.kt | 6 +- .../visionforge/solid/demo/FXDemoGrid.kt | 5 ++ visionforge-core/build.gradle.kts | 5 ++ .../space/kscience/visionforge/Vision.kt | 19 +--- .../kscience/visionforge/VisionChange.kt | 4 +- .../kscience/visionforge/VisionContainer.kt | 31 +++++-- .../space/kscience/visionforge/VisionGroup.kt | 29 ++++-- .../kscience/visionforge/VisionManager.kt | 6 +- .../kscience/visionforge/VisionProperties.kt | 15 +++- .../kscience/visionforge/flowProperty.kt | 55 ++++++++++++ .../space/kscience/visionforge/useProperty.kt | 54 +++++++++++ .../kscience/visionforge/html/HtmlTagTest.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 89 +++++++++++++++++-- .../visionforge/solid/FXReferenceFactory.kt | 2 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 8 +- .../src/commonTest/kotlin/TestCubes.kt | 4 +- visionforge-solid/build.gradle.kts | 4 +- .../kscience/visionforge/solid/Composite.kt | 4 +- .../kscience/visionforge/solid/ConeSegment.kt | 6 +- .../kscience/visionforge/solid/ConeSurface.kt | 6 +- .../kscience/visionforge/solid/Convex.kt | 4 +- .../kscience/visionforge/solid/Extruded.kt | 2 +- .../kscience/visionforge/solid/Hexagon.kt | 6 +- .../kscience/visionforge/solid/LightSource.kt | 4 +- .../kscience/visionforge/solid/PolyLine.kt | 2 +- .../kscience/visionforge/solid/SolidGroup.kt | 10 +-- .../kscience/visionforge/solid/SolidLabel.kt | 4 +- .../visionforge/solid/SolidReference.kt | 8 +- .../kscience/visionforge/solid/Sphere.kt | 4 +- .../kscience/visionforge/solid/SphereLayer.kt | 4 +- .../solid/transform/RemoveSingleChild.kt | 2 +- .../visionforge/solid/transform/UnRef.kt | 8 +- .../kscience/visionforge/solid/GroupTest.kt | 6 +- .../visionforge/solid/SerializationTest.kt | 6 +- .../visionforge/solid/SolidPluginTest.kt | 6 +- .../visionforge/solid/SolidReferenceTest.kt | 6 +- .../visionforge/solid/VisionUpdateTest.kt | 8 +- visionforge-threejs/build.gradle.kts | 2 +- .../solid/three/ThreeBoxFactory.kt | 2 +- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../solid/three/ThreeConeFactory.kt | 2 +- .../solid/three/ThreeConvexFactory.kt | 2 +- .../visionforge/solid/three/ThreeFactory.kt | 2 +- ...eshThreeFactory.kt => ThreeMeshFactory.kt} | 6 +- .../visionforge/solid/three/ThreePlugin.kt | 2 +- .../solid/three/ThreeReferenceFactory.kt | 2 +- .../solid/three/ThreeSphereFactory.kt | 2 +- 53 files changed, 356 insertions(+), 129 deletions(-) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt rename visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/{MeshThreeFactory.kt => ThreeMeshFactory.kt} (96%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index a867f054..b7b79b51 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -352,14 +352,14 @@ private fun SolidGroup.addRootVolume( } block() } - set(combinedName?.let { Name.parse(it) }, group) + setChild(combinedName?.let { Name.parse(it) }, group) } else { val templateName = volumesName + volume.name val existing = getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { val group = buildVolume(volume, context) - set(templateName, group) + setChild(templateName, group) } } diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 723edb3b..294af3ee 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -5,7 +5,7 @@ import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Vision -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.material @@ -18,7 +18,7 @@ class GDMLVisionTest { @Test fun testCubesStyles(){ - val segment = cubes.children["composite-000.segment-0"] as Solid + val segment = cubes.children.getChild("composite-000.segment-0") as Solid println(segment.properties.getValue(Vision.STYLE_KEY)) // println(segment.computePropertyNode(SolidMaterial.MATERIAL_KEY)) // println(segment.computeProperty(SolidMaterial.MATERIAL_COLOR_KEY)) diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index ad37a7c2..b2c69a7d 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -48,6 +48,7 @@ kotlin { implementation("io.ktor:ktor-server-cio:${ktorVersion}") implementation("io.ktor:ktor-server-content-negotiation:${ktorVersion}") implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorVersion}") + implementation("ch.qos.logback:logback-classic:1.2.11") } } jsMain { diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt index 016f2ecf..9b8c6b98 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt @@ -3,7 +3,10 @@ package space.kscience.visionforge.solid.demo import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision +import space.kscience.visionforge.solid.Solids public interface VisionLayout { + val solids: Solids + public fun render(name: Name, vision: V, meta: Meta = Meta.EMPTY) } \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 228f63f7..88c6d154 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -5,6 +5,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -22,6 +23,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro ambientLight{ color.set(Colors.white) } + setAsRoot(solids.visionManager) } render(Name.parse(name), vision, meta) } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt index 6dcfa36f..d448349c 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt @@ -16,6 +16,7 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.Solid +import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreeCanvas import space.kscience.visionforge.solid.three.ThreePlugin @@ -27,6 +28,8 @@ class ThreeDemoGrid(element: Element) : VisionLayout { private val three = Global.fetch(ThreePlugin) + override val solids: Solids get() = three.solids + init { element.clear() element.append { diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 56221efb..e55b1c8d 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -9,7 +9,7 @@ import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.* @@ -20,7 +20,7 @@ internal fun SolidGroup.varBox( ySize: Number, name: String = "", action: VariableBox.() -> Unit = {}, -): VariableBox = VariableBox(xSize, ySize).apply(action).also { set(name, it) } +): VariableBox = VariableBox(xSize, ySize).apply(action).also { setChild(name, it) } internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision() { @@ -59,7 +59,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision material.color.setRGB(r.toFloat() / 256, g.toFloat() / 256, b.toFloat() / 256) mesh.updateMatrix() } - name.startsWith(MeshThreeFactory.EDGES_KEY) -> mesh.applyEdges(this@VariableBox) + name.startsWith(ThreeMeshFactory.EDGES_KEY) -> mesh.applyEdges(this@VariableBox) else -> mesh.updateProperty(this@VariableBox, name) } } diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt index ef03092a..81501016 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt @@ -10,9 +10,11 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.FX3DPlugin import space.kscience.visionforge.solid.FXCanvas3D import space.kscience.visionforge.solid.Solid +import space.kscience.visionforge.solid.Solids import tornadofx.* class FXDemoGrid : View(title = "DataForge-vis FX demo"), VisionLayout { + private val outputs = FXCollections.observableHashMap() override val root: Parent = borderpane { @@ -24,6 +26,9 @@ class FXDemoGrid : View(title = "DataForge-vis FX demo"), VisionLayout { } private val fx3d = Global.fetch(FX3DPlugin) + override val solids: Solids get() = fx3d.solids + + override fun render(name: Name, vision: Solid, meta: Meta) { outputs.getOrPut(name) { FXCanvas3D(fx3d, canvasOptions) }.render(vision) diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index d9bf251c..a8886521 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -13,6 +13,11 @@ kotlin { api("org.jetbrains.kotlin-wrappers:kotlin-css") } } + commonTest{ + dependencies{ + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") + } + } jsMain { dependencies { api("org.jetbrains.kotlin-wrappers:kotlin-extensions") diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index a8b590e7..aa698409 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -11,10 +11,8 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties import space.kscience.visionforge.Vision.Companion.TYPE -import kotlin.reflect.KProperty1 /** * A root type for display hierarchy @@ -72,19 +70,4 @@ public fun Vision.onPropertyChange( callback: (Name) -> Unit ): Job = properties.changes.onEach { callback(it) -}.launchIn(scope ?: error("Orphan Vision can't observe properties")) - - -public fun V.useProperty( - property: KProperty1, - scope: CoroutineScope? = manager?.context, - callBack: V.(T) -> Unit, -): Job { - //Pass initial value. - callBack(property.get(this)) - return properties.changes.onEach { name -> - if (name.startsWith(property.name.asName())) { - callBack(property.get(this@useProperty)) - } - }.launchIn(scope ?: error("Orphan Vision can't observe properties")) -} \ No newline at end of file +}.launchIn(scope ?: error("Orphan Vision can't observe properties")) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 0e3a8dc1..29c38ebd 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -47,7 +47,7 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi } } - override fun set(name: Name?, child: Vision?) { + override fun setChild(name: Name?, child: Vision?) { if (name == null) error("Static children are not allowed in VisionChange") getOrPutChild(name).apply { vision = child @@ -109,7 +109,7 @@ private fun CoroutineScope.collectChange( if (after != null) { collectChange(fullName, after, collector) } - collector()[fullName] = after + collector().setChild(fullName, after) }?.launchIn(this) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 481a53ce..bda9ab42 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -11,12 +11,12 @@ import kotlin.jvm.Synchronized public annotation class VisionBuilder public interface VisionContainer { - public operator fun get(name: Name): V? + public fun getChild(name: Name): V? } public interface MutableVisionContainer { //TODO add documentation - public operator fun set(name: Name?, child: V?) + public fun setChild(name: Name?, child: V?) } /** @@ -33,10 +33,10 @@ public interface VisionChildren : VisionContainer { public operator fun get(token: NameToken): Vision? - override fun get(name: Name): Vision? = when (name.length) { + override fun getChild(name: Name): Vision? = when (name.length) { 0 -> group 1 -> get(name.first()) - else -> get(name.first())?.children?.get(name.cutFirst()) + else -> get(name.first())?.children?.getChild(name.cutFirst()) } public companion object { @@ -49,6 +49,10 @@ public interface VisionChildren : VisionContainer { } } +public operator fun VisionChildren.get(name: Name): Vision? = getChild(name) +public operator fun VisionChildren.get(name: String): Vision? = getChild(name) + + public fun VisionChildren.isEmpty(): Boolean = keys.isEmpty() public inline fun VisionChildren.forEach(block: (NameToken, Vision) -> Unit) { @@ -61,7 +65,7 @@ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer< public operator fun set(token: NameToken, value: Vision?) - override fun set(name: Name?, child: Vision?) { + override fun setChild(name: Name?, child: Vision?) { when { name == null -> { if (child != null) { @@ -81,7 +85,7 @@ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer< val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: group.createGroup().also { set(name.first(), it) } - parent.children[name.cutFirst()] = child + parent.children.setChild(name.cutFirst(), child) } } } @@ -89,6 +93,15 @@ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer< public fun clear() } +public operator fun MutableVisionChildren.set(name: Name?, vision: Vision?) { + setChild(name, vision) +} + +public operator fun MutableVisionChildren.set(name: String?, vision: Vision?) { + setChild(name, vision) +} + + /** * Add a static child. Statics could not be found by name, removed or replaced. Changing statics also do not trigger events. */ @@ -102,11 +115,11 @@ public fun VisionChildren.asSequence(): Sequence> = sequ public operator fun VisionChildren.iterator(): Iterator> = asSequence().iterator() -public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) +public fun VisionContainer.getChild(str: String): V? = getChild(Name.parse(str)) -public operator fun MutableVisionContainer.set( +public fun MutableVisionContainer.setChild( str: String?, vision: V?, -): Unit = set(str?.parseAsName(), vision) +): Unit = setChild(str?.parseAsName(), vision) internal abstract class VisionChildrenImpl( override val group: MutableVisionGroup, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 8faa21b4..613a5dfe 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -10,7 +10,6 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.plus import space.kscience.visionforge.Vision.Companion.STYLE_KEY -import kotlin.js.JsName public interface VisionGroup : Vision { @@ -35,9 +34,9 @@ public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { - change.delete -> children[name] = null - change.vision != null -> children[name] = change.vision - else -> children[name]?.update(change) + change.delete -> children.setChild(name, null) + change.vision != null -> children.setChild(name, change.vision) + else -> children.getChild(name)?.update(change) } } change.properties?.let { @@ -87,12 +86,28 @@ public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup */ @Serializable @SerialName("vision.group") -public class SimpleVisionGroup : AbstractVisionGroup() { +public class SimpleVisionGroup : AbstractVisionGroup(), MutableVisionContainer { override fun createGroup(): SimpleVisionGroup = SimpleVisionGroup() + + override fun setChild(name: Name?, child: Vision?) { + children.setChild(name, child) + } } -@JsName("createVisionGroup") -public fun VisionGroup(): VisionGroup = SimpleVisionGroup() +@VisionBuilder +public fun MutableVisionContainer.group( + name: Name? = null, + builder: SimpleVisionGroup.() -> Unit = {}, +): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } + +/** + * Define a group with given [name], attach it to this parent and return it. + */ +@VisionBuilder +public fun MutableVisionContainer.group( + name: String, + builder: SimpleVisionGroup.() -> Unit = {}, +): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } //fun VisualObject.findStyle(styleName: Name): Meta? { // if (this is VisualGroup) { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index a6f1a7c6..314b15d5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -19,7 +19,7 @@ import space.kscience.visionforge.html.VisionOfNumberField import space.kscience.visionforge.html.VisionOfTextField import kotlin.reflect.KClass -public class VisionManager(meta: Meta) : AbstractPlugin(meta) { +public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionContainer { override val tag: PluginTag get() = Companion.tag /** @@ -58,6 +58,10 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { public fun encodeToMeta(vision: Vision, descriptor: MetaDescriptor? = null): Meta = encodeToJsonElement(vision).toMeta(descriptor) + override fun setChild(name: Name?, child: Vision?) { + child?.setAsRoot(this) + } + public companion object : PluginFactory { override val tag: PluginTag = PluginTag(name = "vision", group = PluginTag.DATAFORGE_GROUP) override val type: KClass = VisionManager::class diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 693e85bf..1f751d55 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -73,6 +73,19 @@ public interface MutableVisionProperties : VisionProperties { ) } +public fun MutableVisionProperties.remove(name: Name){ + setProperty(name, null) +} + +public fun MutableVisionProperties.remove(name: String){ + remove(name.parseAsName()) +} + +@VisionBuilder +public operator fun MutableVisionProperties.invoke(block: MutableMeta.() -> Unit) { + root(inherit = false, includeStyles = false).apply(block) +} + private class VisionPropertiesItem( val properties: MutableVisionProperties, val nodeName: Name, @@ -190,7 +203,7 @@ public abstract class AbstractVisionProperties( } @Transient - private val _changes = MutableSharedFlow(10) + private val _changes = MutableSharedFlow() override val changes: SharedFlow get() = _changes @OptIn(DelicateCoroutinesApi::class) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt new file mode 100644 index 00000000..c8f14ae3 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt @@ -0,0 +1,55 @@ +package space.kscience.visionforge + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.Value +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.parseAsName +import space.kscience.dataforge.names.startsWith + +/** + * Create a flow of a specific property + */ +public fun Vision.flowProperty( + propertyName: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Flow = flow { + //Pass initial value. + emit(properties.getProperty(propertyName, inherit, includeStyles)) + properties.changes.collect { name -> + if (name.startsWith(propertyName)) { + emit(properties.getProperty(propertyName, inherit, includeStyles)) + } + } +} + +public fun Vision.flowProperty( + propertyName: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Flow = flowProperty(propertyName.parseAsName(), inherit, includeStyles) + +/** + * Flow the value of specific property + */ +public fun Vision.flowPropertyValue( + propertyName: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Flow = flow { + //Pass initial value. + emit(properties.getValue(propertyName, inherit, includeStyles)) + properties.changes.collect { name -> + if (name.startsWith(propertyName)) { + emit(properties.getValue(propertyName, inherit, includeStyles)) + } + } +} + +public fun Vision.flowPropertyValue( + propertyName: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, +): Flow = flowPropertyValue(propertyName.parseAsName(), inherit, includeStyles) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt new file mode 100644 index 00000000..b7cec960 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -0,0 +1,54 @@ +package space.kscience.visionforge + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName +import space.kscience.dataforge.names.startsWith +import kotlin.reflect.KProperty1 + + +/** + * Call [callBack] on initial value of the property and then on all subsequent values after change + */ +public fun Vision.useProperty( + propertyName: Name, + inherit: Boolean? = null, + includeStyles: Boolean? = null, + scope: CoroutineScope? = manager?.context, + callBack: (Meta) -> Unit, +): Job { + //Pass initial value. + callBack(properties.getProperty(propertyName, inherit, includeStyles)) + return properties.changes.onEach { name -> + if (name.startsWith(propertyName)) { + callBack(properties.getProperty(propertyName, inherit, includeStyles)) + } + }.launchIn(scope ?: error("Orphan Vision can't observe properties")) +} + +public fun Vision.useProperty( + propertyName: String, + inherit: Boolean? = null, + includeStyles: Boolean? = null, + scope: CoroutineScope? = manager?.context, + callBack: (Meta) -> Unit, +): Job = useProperty(propertyName.parseAsName(),inherit, includeStyles, scope, callBack) + +public fun V.useProperty( + property: KProperty1, + scope: CoroutineScope? = manager?.context, + callBack: V.(T) -> Unit, +): Job { + //Pass initial value. + callBack(property.get(this)) + return properties.changes.onEach { name -> + if (name.startsWith(property.name.asName())) { + callBack(property.get(this@useProperty)) + } + }.launchIn(scope ?: error("Orphan Vision can't observe properties")) +} \ No newline at end of file diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index f72fe2bf..670f2018 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -30,7 +30,7 @@ fun FlowContent.renderVisionFragment( @DFExperimental -private fun VisionOutput.base(block: VisionGroup.() -> Unit) = VisionGroup().apply(block) +private fun VisionOutput.base(block: VisionGroup.() -> Unit) = context.visionManager.group().apply(block) @DFExperimental class HtmlTagTest { diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index e7a35faa..64f0d0b2 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,10 +1,14 @@ package space.kscience.visionforge.meta +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectIndexed +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.runTest +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.* -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.getProperty -import space.kscience.visionforge.getValue -import space.kscience.visionforge.set +import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals @@ -17,9 +21,12 @@ private class TestScheme : Scheme() { } internal class VisionPropertyTest { + + private val manager = Global.fetch(VisionManager) + @Test fun testPropertyWrite() { - val vision = VisionGroup() + val vision = manager.group() vision.properties["fff"] = 2 vision.properties["fff.ddd"] = false @@ -29,7 +36,7 @@ internal class VisionPropertyTest { @Test fun testPropertyEdit() { - val vision = VisionGroup() + val vision = manager.group() vision.properties.getProperty("fff.ddd").apply { value = 2.asValue() } @@ -39,10 +46,78 @@ internal class VisionPropertyTest { @Test fun testPropertyUpdate() { - val vision = VisionGroup() + val vision = manager.group() vision.properties.getProperty("fff").updateWith(TestScheme) { ddd = 2 } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) } + + @Test + fun testChildrenPropertyPropagation() = runTest(dispatchTimeoutMs = 200) { + val group = Global.fetch(VisionManager).group { + properties { + "test" put 11 + } + group("child") { + properties { + "test" put 22 + } + } + } + + val child = group.children["child"]!! + + var value: Value? = null + + var callCounter = 0 + + child.useProperty("test", inherit = true) { + callCounter++ + value = it.value + } + + assertEquals(22, value?.int) + assertEquals(1, callCounter) + + child.properties.remove("test") + + //Need this to avoid the race + delay(20) + + assertEquals(11, child.properties.getProperty("test", inherit = true).int) + assertEquals(11, value?.int) + assertEquals(2, callCounter) + } + + @Test + fun testChildrenPropertyFlow() = runTest(dispatchTimeoutMs = 200) { + val group = Global.fetch(VisionManager).group { + properties { + "test" put 11 + } + group("child") { + properties { + "test" put 22 + } + } + } + + val child = group.children["child"]!! + + launch { + child.flowPropertyValue("test", inherit = true).collectIndexed { index, value -> + if (index == 0) { + assertEquals(22, value?.int) + } else if (index == 1) { + assertEquals(11, value?.int) + cancel() + } + } + } + //wait for subscription to be created + delay(10) + + child.properties.remove("test") + } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index 60b95f9f..1c3ecb60 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -22,7 +22,7 @@ public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { val group: SolidGroup = volume(root, volume) - this[physVolume.name] = group.withPosition(root, physVolume) + this.setChild(physVolume.name, group.withPosition(root, physVolume)) } GdmlLoaderOptions.Action.PROTOTYPE -> { proxyVolume(root, this, physVolume, volume) @@ -357,7 +357,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { final.prototypes { proto.items.forEach { (token, item) -> item.parent = null - set(token.asName(), item as? Solid) + setChild(token.asName(), item as? Solid) } } settings.styleCache.forEach { @@ -385,7 +385,7 @@ public fun Gdml.toVision(block: GdmlLoaderOptions.() -> Unit = {}): SolidGroup { public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoaderOptions.() -> Unit = {}) { val vision = gdml.toVision(transformer) //println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual)) - children[key] = vision + children.setChild(key, vision) } @VisionBuilder diff --git a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt index a30cf863..aa262c45 100644 --- a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt +++ b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt @@ -4,7 +4,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.gdml.* import space.kscience.visionforge.Vision -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import space.kscience.visionforge.solid.* import space.kscience.visionforge.visionManager import kotlin.test.Test @@ -26,7 +26,7 @@ class TestCubes { val smallBoxPrototype = vision.getPrototype(Name.parse("solids.smallBox")) as? Box assertNotNull(smallBoxPrototype) assertEquals(30.0, smallBoxPrototype.xSize.toDouble()) - val smallBoxVision = vision.children["composite-111.smallBox"]?.prototype as? Box + val smallBoxVision = vision.children.getChild("composite-111.smallBox")?.prototype as? Box assertNotNull(smallBoxVision) assertEquals(30.0, smallBoxVision.xSize.toDouble()) } diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index f794afe4..7a0f145c 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -1,3 +1,5 @@ +import space.kscience.gradle.KScienceVersions + plugins { id("space.kscience.gradle.mpp") } @@ -17,7 +19,7 @@ kotlin { } commonTest{ dependencies{ - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${KScienceVersions.coroutinesVersion}") } } jvmTest{ diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index fb1b4774..1c28025c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -35,7 +35,7 @@ public inline fun MutableVisionContainer.composite( res.properties.setProperty(Name.EMPTY, group.properties.own) - set(name, res) + setChild(name, res) return res } @@ -57,7 +57,7 @@ public fun SolidGroup.smartComposite( } this } else { - children[name] = group + children.setChild(name, group) group } } else { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt index 1a8e4a9d..873ae44e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild import kotlin.math.cos import kotlin.math.sin @@ -76,7 +76,7 @@ public inline fun MutableVisionContainer.cylinder( r.toFloat(), height.toFloat(), r.toFloat() -).apply(block).also { set(name, it) } +).apply(block).also { setChild(name, it) } @VisionBuilder public inline fun MutableVisionContainer.cone( @@ -93,4 +93,4 @@ public inline fun MutableVisionContainer.cone( topRadius = upperRadius.toFloat(), startAngle = startAngle.toFloat(), angle = angle.toFloat() -).apply(block).also { set(name, it) } \ No newline at end of file +).apply(block).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index b5a4d5cf..0bc023e6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin @@ -139,7 +139,7 @@ public inline fun MutableVisionContainer.tube( topInnerRadius = innerRadius.toFloat(), startAngle = startAngle.toFloat(), angle = angle.toFloat() -).apply(block).also { set(name, it) } +).apply(block).also { setChild(name, it) } @VisionBuilder public inline fun MutableVisionContainer.coneSurface( @@ -160,4 +160,4 @@ public inline fun MutableVisionContainer.coneSurface( topInnerRadius = topInnerRadius.toFloat(), startAngle = startAngle.toFloat(), angle = angle.toFloat() -).apply(block).also { set(name, it) } \ No newline at end of file +).apply(block).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt index ad0a456e..4d50c2c4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild @Serializable @SerialName("solid.convex") @@ -12,7 +12,7 @@ public class Convex(public val points: List) : SolidBase() public inline fun MutableVisionContainer.convex( name: String? = null, action: ConvexBuilder.() -> Unit = {}, -): Convex = ConvexBuilder().apply(action).build().also { set(name, it) } +): Convex = ConvexBuilder().apply(action).build().also { setChild(name, it) } public class ConvexBuilder { private val points = ArrayList() diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 68eded95..faec109b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -115,4 +115,4 @@ public class ExtrudeBuilder( public fun MutableVisionContainer.extruded( name: String? = null, action: ExtrudeBuilder.() -> Unit = {}, -): Extruded = ExtrudeBuilder().apply(action).build().also { set(name, it) } \ No newline at end of file +): Extruded = ExtrudeBuilder().apply(action).build().also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt index b327f9bf..92f11e1b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild public interface Hexagon : GeometrySolid { public val node1: Point3D @@ -58,7 +58,7 @@ public inline fun MutableVisionContainer.box( zSize: Number, name: String? = null, block: Box.() -> Unit = {}, -): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(block).also { set(name, it) } +): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(block).also { setChild(name, it) } @Serializable @SerialName("solid.hexagon") @@ -85,4 +85,4 @@ public inline fun MutableVisionContainer.hexagon( node8: Point3D, name: String? = null, action: Hexagon.() -> Unit = {}, -): Hexagon = GenericHexagon(node1, node2, node3, node4, node5, node6, node7, node8).apply(action).also { set(name, it) } \ No newline at end of file +): Hexagon = GenericHexagon(node1, node2, node3, node4, node5, node6, node7, node8).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 13736fcd..3db461ef 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -55,7 +55,7 @@ public class AmbientLightSource : LightSource() public fun MutableVisionContainer.ambientLight( name: String? = "@ambientLight", block: AmbientLightSource.() -> Unit = {}, -): AmbientLightSource = AmbientLightSource().apply(block).also { set(name, it) } +): AmbientLightSource = AmbientLightSource().apply(block).also { setChild(name, it) } @Serializable @SerialName("solid.light.point") @@ -71,5 +71,5 @@ public fun MutableVisionContainer.pointLight( block: PointLightSource.() -> Unit = {}, ): PointLightSource = PointLightSource().apply(block).also { it.position = Point3D(x, y, z) - set(name, it) + setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index 587e803c..4d5373b8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -18,4 +18,4 @@ public fun MutableVisionContainer.polyline( vararg points: Point3D, name: String? = null, action: PolyLine.() -> Unit = {}, -): PolyLine = PolyLine(points.toList()).apply(action).also { set(name, it) } \ No newline at end of file +): PolyLine = PolyLine(points.toList()).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 80a1129d..f3ca4cf8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -38,7 +38,7 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable it to value }.toMap() - public operator fun get(name: Name): Solid? = children[name] as? Solid + public operator fun get(name: Name): Solid? = children.getChild(name) as? Solid private var prototypes: SolidGroup? get() = items[PROTOTYPES_TOKEN] as? SolidGroup @@ -70,8 +70,8 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable // super.update(change) // } - override fun set(name: Name?, child: Solid?) { - children[name] = child + override fun setChild(name: Name?, child: Solid?) { + children.setChild(name, child) } public companion object { @@ -85,7 +85,7 @@ public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGr public fun MutableVisionContainer.group( name: Name? = null, builder: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup(builder).also { set(name, it) } +): SolidGroup = SolidGroup(builder).also { setChild(name, it) } /** * Define a group with given [name], attach it to this parent and return it. @@ -94,4 +94,4 @@ public fun MutableVisionContainer.group( public fun MutableVisionContainer.group( name: String, action: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup(action).also { set(name, it) } +): SolidGroup = SolidGroup(action).also { setChild(name, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt index 649e7f7c..2e59c1f8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild @Serializable @SerialName("solid.label") @@ -21,4 +21,4 @@ public fun MutableVisionContainer.label( fontFamily: String = "Arial", name: String? = null, action: SolidLabel.() -> Unit = {}, -): SolidLabel = SolidLabel(text, fontSize.toDouble(), fontFamily).apply(action).also { set(name, it) } \ No newline at end of file +): SolidLabel = SolidLabel(text, fontSize.toDouble(), fontFamily).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 51e0bc6b..76eb56aa 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -97,7 +97,7 @@ internal class SolidReferenceChild( ) : Solid, VisionGroup { val prototype: Solid - get() = owner.prototype.children?.get(childName) as? Solid + get() = owner.prototype.children?.getChild(childName) as? Solid ?: error("Prototype with name $childName not found") override val descriptor: MetaDescriptor get() = prototype.descriptor @@ -137,7 +137,7 @@ internal class SolidReferenceChild( when { change.delete -> error("Deleting children inside ref is not allowed.") change.vision != null -> error("Updating content of the ref is not allowed") - else -> children[name]?.update(change) + else -> children.getChild(name)?.update(change) } } change.properties?.let { @@ -176,7 +176,7 @@ internal class SolidReferenceChild( public fun MutableVisionContainer.ref( templateName: Name, name: String? = null, -): SolidReference = SolidReference(templateName).also { set(name, it) } +): SolidReference = SolidReference(templateName).also { setChild(name, it) } public fun MutableVisionContainer.ref( templateName: String, @@ -195,7 +195,7 @@ public fun SolidGroup.newRef( val existing = prototypeHolder.getPrototype(prototypeName) if (existing == null) { prototypeHolder.prototypes { - set(prototypeName, obj) + setChild(prototypeName, obj) } } else if (existing != obj) { error("Can't add different prototype on top of existing one") diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt index 0ce0d893..ed43f663 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Sphere.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin @@ -58,4 +58,4 @@ public inline fun MutableVisionContainer.sphere( action: Sphere.() -> Unit = {}, ): Sphere = Sphere( radius.toFloat(), -).apply(action).also { set(name, it) } \ No newline at end of file +).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt index 709968af..bb630772 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.set +import space.kscience.visionforge.setChild import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin @@ -85,4 +85,4 @@ public inline fun MutableVisionContainer.sphereLayer( phi.toFloat(), thetaStart.toFloat(), theta.toFloat() -).apply(action).also { set(name, it) } \ No newline at end of file +).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index dc01e749..d1e6fe5a 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -39,7 +39,7 @@ internal object RemoveSingleChild : VisualTreeTransform() { val child: Solid = parent.items.values.first() val newParent = child.updateFrom(parent) newParent.parent = null - children[childName.asName()] = newParent + children.setChild(childName.asName(), newParent) } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt index b78863d2..72fa1a76 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/UnRef.kt @@ -4,14 +4,8 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.SolidReference -import kotlin.collections.HashMap -import kotlin.collections.Map import kotlin.collections.component1 import kotlin.collections.component2 -import kotlin.collections.filter -import kotlin.collections.filterIsInstance -import kotlin.collections.fold -import kotlin.collections.forEach import kotlin.collections.set @DFExperimental @@ -33,7 +27,7 @@ internal object UnRef : VisualTreeTransform() { private fun SolidGroup.unref(name: Name) { (this as? SolidGroup)?.prototypes{ - set(name, null) + setChild(name, null) } items.filter { (it.value as? SolidReference)?.prototypeName == name }.forEach { (key, value) -> val reference = value as SolidReference diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt index 87de5c77..013a8d4c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid import space.kscience.visionforge.Colors -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import kotlin.math.PI import kotlin.test.Test import kotlin.test.assertEquals @@ -45,7 +45,7 @@ class GroupTest { } assertEquals(3, group.items.count()) - assertEquals(300.0, (group.children["intersect"] as Solid).y.toDouble()) - assertEquals(-300.0, (group.children["subtract"] as Solid).y.toDouble()) + assertEquals(300.0, (group.children.getChild("intersect") as Solid).y.toDouble()) + assertEquals(-300.0, (group.children.getChild("subtract") as Solid).y.toDouble()) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index c2dee067..49c90dab 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import kotlin.test.Test import kotlin.test.assertEquals @@ -52,7 +52,7 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group.children["cube"]?.properties?.own, reconstructed.children["cube"]?.properties?.own) + assertEquals(group.children.getChild("cube")?.properties?.own, reconstructed.children.getChild("cube")?.properties?.own) } @Test @@ -66,7 +66,7 @@ class SerializationTest { val serialized = Solids.encodeToString(group) val reconstructed = Solids.decodeFromString(serialized) as SolidGroup - assertEquals(100.0, (reconstructed.children["@ambientLight"] as AmbientLightSource).intensity.toDouble()) + assertEquals(100.0, (reconstructed.children.getChild("@ambientLight") as AmbientLightSource).intensity.toDouble()) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt index 4ac22e1f..d60b9042 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import kotlin.test.Test import kotlin.test.assertEquals @@ -25,8 +25,8 @@ class SolidPluginTest { val reconstructed = visionManager.decodeFromMeta(meta) as SolidGroup assertEquals( - visionManager.encodeToJsonElement(vision.children["aBox"]!!), - visionManager.encodeToJsonElement(reconstructed.children["aBox"]!!) + visionManager.encodeToJsonElement(vision.children.getChild("aBox")!!), + visionManager.encodeToJsonElement(reconstructed.children.getChild("aBox")!!) ) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index f74426ba..027f8b03 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.json.encodeToJsonElement import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.get -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import space.kscience.visionforge.style import space.kscience.visionforge.useStyle import kotlin.test.Test @@ -24,7 +24,7 @@ class SolidReferenceTest { @Test fun testReferenceProperty(){ - assertEquals("blue", (groupWithReference.children["test"] as Solid).color.string) + assertEquals("blue", (groupWithReference.children.getChild("test") as Solid).color.string) } @Test @@ -32,6 +32,6 @@ class SolidReferenceTest { val serialized = Solids.jsonForSolids.encodeToJsonElement(groupWithReference) val deserialized = Solids.jsonForSolids.decodeFromJsonElement(SolidGroup.serializer(), serialized) assertEquals(groupWithReference.items["test"]?.color.string, deserialized.items["test"]?.color.string) - assertEquals("blue", (deserialized.children["test"] as Solid).color.string) + assertEquals("blue", (deserialized.children.getChild("test") as Solid).color.string) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index e5a13594..2cf5c861 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -6,7 +6,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.names.asName import space.kscience.visionforge.VisionChange -import space.kscience.visionforge.get +import space.kscience.visionforge.getChild import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -29,9 +29,9 @@ internal class VisionUpdateTest { propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } targetVision.update(dif) - assertTrue { targetVision.children["top"] is SolidGroup } - assertEquals("red", (targetVision.children["origin"] as Solid).color.string) // Should work - assertEquals("#00007b", (targetVision.children["top"] as Solid).color.string) // new item always takes precedence + assertTrue { targetVision.children.getChild("top") is SolidGroup } + assertEquals("red", (targetVision.children.getChild("origin") as Solid).color.string) // Should work + assertEquals("#00007b", (targetVision.children.getChild("top") as Solid).color.string) // new item always takes precedence } @Test diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index d9d0f96d..86b8702c 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -10,6 +10,6 @@ kotlin{ dependencies { api(project(":visionforge-solid")) - implementation(npm("three", "0.137.4")) + implementation(npm("three", "0.137.5")) implementation(npm("three-csg-ts", "3.1.10")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt index a5b50688..f66492ed 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt @@ -4,7 +4,7 @@ import info.laht.threekt.geometries.BoxGeometry import space.kscience.visionforge.solid.Box import space.kscience.visionforge.solid.detail -public object ThreeBoxFactory : MeshThreeFactory(Box::class) { +public object ThreeBoxFactory : ThreeMeshFactory(Box::class) { override fun buildGeometry(obj: Box): BoxGeometry = obj.detail?.let { detail -> BoxGeometry(obj.xSize, obj.ySize, obj.zSize, detail, detail, detail) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 4bd9826c..de318f95 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -50,7 +50,7 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory obj.onPropertyChange { name -> when { //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) - name.startsWith(MeshThreeFactory.EDGES_KEY) -> applyEdges(obj) + name.startsWith(ThreeMeshFactory.EDGES_KEY) -> applyEdges(obj) else -> updateProperty(obj, name) } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt index 5789c30e..8eed04ae 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.solid.detail import kotlin.math.PI import kotlin.math.pow -public object ThreeConeFactory : MeshThreeFactory(ConeSegment::class) { +public object ThreeConeFactory : ThreeMeshFactory(ConeSegment::class) { override fun buildGeometry(obj: ConeSegment): BufferGeometry { val cylinder = obj.detail?.let { val segments = it.toDouble().pow(0.5).toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt index fe08b1cf..2ab67219 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.external.geometries.ConvexBufferGeometry import space.kscience.visionforge.solid.Convex -public object ThreeConvexFactory : MeshThreeFactory(Convex::class) { +public object ThreeConvexFactory : ThreeMeshFactory(Convex::class) { override fun buildGeometry(obj: Convex): ConvexBufferGeometry { val vectors = obj.points.map { it.toVector() }.toTypedArray() return ConvexBufferGeometry(vectors) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 3397ea96..8c39aeb3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -75,7 +75,7 @@ public fun Object3D.updateProperty(source: Vision, propertyName: Name) { /** * Generic factory for elements which provide inside geometry builder */ -public object ThreeShapeFactory : MeshThreeFactory(GeometrySolid::class) { +public object ThreeShapeFactory : ThreeMeshFactory(GeometrySolid::class) { override fun buildGeometry(obj: GeometrySolid): BufferGeometry = ThreeGeometryBuilder().apply { obj.toGeometry(this) }.build() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt similarity index 96% rename from visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt rename to visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index 9309848f..ea39bbea 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -15,14 +15,14 @@ import space.kscience.visionforge.set import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.layer -import space.kscience.visionforge.solid.three.MeshThreeFactory.Companion.EDGES_ENABLED_KEY -import space.kscience.visionforge.solid.three.MeshThreeFactory.Companion.EDGES_MATERIAL_KEY +import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY +import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY import kotlin.reflect.KClass /** * Basic geometry-based factory */ -public abstract class MeshThreeFactory( +public abstract class ThreeMeshFactory( override val type: KClass, ) : ThreeFactory { /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 2fe9585c..7c1358d7 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -82,7 +82,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { }.launchIn(context) obj.children.changes.onEach { childName -> - val child = obj.children[childName] + val child = obj.children.getChild(childName) //removing old object findChild(childName)?.let { oldChild -> diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 27657931..ade11074 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -53,7 +53,7 @@ public object ThreeReferenceFactory : ThreeFactory { ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() val referenceChild = - obj.children[childName] ?: error("Reference child with name '$childName' not found") + obj.children.getChild(childName) ?: error("Reference child with name '$childName' not found") val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") child.updateProperty(referenceChild, propertyName) } else { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt index 8932a6c8..9d4926c5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt @@ -5,7 +5,7 @@ import info.laht.threekt.geometries.SphereGeometry import space.kscience.visionforge.solid.Sphere import space.kscience.visionforge.solid.detail -public object ThreeSphereFactory : MeshThreeFactory(Sphere::class) { +public object ThreeSphereFactory : ThreeMeshFactory(Sphere::class) { override fun buildGeometry(obj: Sphere): BufferGeometry { return obj.detail?.let {detail -> SphereGeometry( -- 2.34.1 From c586a2ea14f2b3be330914abe8b93d2efd0fdf16 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 13 Aug 2022 18:17:22 +0300 Subject: [PATCH 083/143] Fix (almost) property resolution --- .../src/jvmMain/kotlin/formServer.kt | 2 +- .../visionforge/solid/demo/VariableBox.kt | 1 + .../visionforge/react/PropertyEditor.kt | 6 ++- .../ringThreeControls.kt | 2 + .../kscience/visionforge/StyleReference.kt | 4 +- .../space/kscience/visionforge/StyleSheet.kt | 8 ++-- .../kscience/visionforge/VisionChange.kt | 2 +- .../kscience/visionforge/VisionProperties.kt | 41 ++++++++++++------ .../visionforge/html/VisionTagConsumer.kt | 4 +- .../space/kscience/visionforge/useProperty.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 42 +++++++++++-------- .../kscience/visionforge/solid/FX3DPlugin.kt | 4 +- .../visionforge/solid/FXCompositeFactory.kt | 2 +- .../visionforge/solid/FXConvexFactory.kt | 2 +- .../visionforge/solid/FXReferenceFactory.kt | 10 +++-- .../visionforge/solid/FXShapeFactory.kt | 2 +- ...lObjectFXBinding.kt => VisionFXBinding.kt} | 2 +- .../visionforge/gdml/GdmlLoaderOptions.kt | 2 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 2 +- .../visionforge/solid/SolidReference.kt | 26 +++++++++++- .../{PropertyTest.kt => SolidPropertyTest.kt} | 10 +++-- .../solid/three/ThreeLabelFactory.kt | 2 +- .../solid/three/ThreeMeshFactory.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 7 +++- 24 files changed, 123 insertions(+), 64 deletions(-) rename visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/{VisualObjectFXBinding.kt => VisionFXBinding.kt} (96%) rename visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/{PropertyTest.kt => SolidPropertyTest.kt} (92%) diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 7397b6b6..accd1a16 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -49,7 +49,7 @@ fun main() { } vision("form") { form } - form.onPropertyChange { + form.onPropertyChange { _, _ -> println(this) } } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index e55b1c8d..28b0c968 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -59,6 +59,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision material.color.setRGB(r.toFloat() / 256, g.toFloat() / 256, b.toFloat() / 256) mesh.updateMatrix() } + name.startsWith(ThreeMeshFactory.EDGES_KEY) -> mesh.applyEdges(this@VariableBox) else -> mesh.updateProperty(this@VariableBox, name) } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 4e94ef06..ca64fd07 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -74,6 +74,8 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { val descriptor: MetaDescriptor? = useMemo(props.descriptor, props.name) { props.descriptor?.get(props.name) } var property: MutableMeta by useState { props.meta.getOrCreate(props.name) } + val defined = props.getPropertyState(props.name) == EditorPropertyState.Defined + val keys = useMemo(descriptor) { buildSet { descriptor?.children?.filterNot { @@ -134,7 +136,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { styledSpan { css { +TreeStyles.treeLabel - if (property.isEmpty()) { + if (!defined) { +TreeStyles.treeLabelInactive } } @@ -175,7 +177,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +"\u00D7" attrs { - if (property.isEmpty()) { + if (!defined) { disabled = true } else { onClickFunction = removeClick diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 1b62bd1f..6a440e71 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.ring +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.css.BorderStyle import kotlinx.css.Color @@ -52,6 +53,7 @@ internal external interface CanvasControlsProps : Props { public var vision: Vision? } +@OptIn(DelicateCoroutinesApi::class) internal val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt index 0e2b6132..62d898b8 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt @@ -18,10 +18,10 @@ private tailrec fun styleIsDefined(vision: Vision, reference: StyleReference): B } @VisionBuilder -public fun Vision.useStyle(reference: StyleReference) { +public fun Vision.useStyle(reference: StyleReference, notify: Boolean = true) { //check that style is defined in a parent //check(styleIsDefined(this, reference)) { "Style reference does not belong to a Vision parent" } - useStyle(reference.name) + useStyle(reference.name, notify) } @VisionBuilder diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 1c05d6d6..11e76d0c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -83,10 +83,12 @@ public var Vision.styles: List public val Vision.styleSheet: StyleSheet get() = StyleSheet(this) /** - * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. + * Add style name to the list of styles to be resolved later. + * The style with given name does not necessary exist at the moment. */ -public fun Vision.useStyle(name: String) { - styles = (properties.own?.get(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name +public fun Vision.useStyle(name: String, notify: Boolean = true) { + val newStyle = properties.own?.get(Vision.STYLE_KEY)?.value?.list?.plus(name.asValue()) ?: listOf(name.asValue()) + properties.setValue(Vision.STYLE_KEY, newStyle.asValue(), notify) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 29c38ebd..cfd522b3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -119,7 +119,7 @@ private fun CoroutineScope.collectChange( public fun Vision.flowChanges( collectionDuration: Duration, ): Flow = flow { - val manager = manager?: error("Orphan vision could not collect changes") + val manager = manager ?: error("Orphan vision could not collect changes") var collector = VisionChangeBuilder(manager) coroutineScope { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 1f751d55..c15c6c55 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -61,23 +61,24 @@ public interface MutableVisionProperties : VisionProperties { includeStyles, ) - public fun setProperty( name: Name, node: Meta?, + notify: Boolean = true, ) public fun setValue( name: Name, value: Value?, + notify: Boolean = true, ) } -public fun MutableVisionProperties.remove(name: Name){ +public fun MutableVisionProperties.remove(name: Name) { setProperty(name, null) } -public fun MutableVisionProperties.remove(name: String){ +public fun MutableVisionProperties.remove(name: String) { remove(name.parseAsName()) } @@ -180,7 +181,7 @@ public abstract class AbstractVisionProperties( return descriptor?.defaultValue } - override fun setProperty(name: Name, node: Meta?) { + override fun setProperty(name: Name, node: Meta?, notify: Boolean) { //TODO check old value? if (name.isEmpty()) { properties = node?.asMutableMeta() @@ -189,25 +190,42 @@ public abstract class AbstractVisionProperties( } else { getOrCreateProperties().setMeta(name, node) } - invalidate(name) + if (notify) { + invalidate(name) + } } - override fun setValue(name: Name, value: Value?) { + override fun setValue(name: Name, value: Value?, notify: Boolean) { //TODO check old value? if (value == null) { properties?.getMeta(name)?.value = null } else { getOrCreateProperties().setValue(name, value) } - invalidate(name) + if (notify) { + invalidate(name) + } } @Transient - private val _changes = MutableSharedFlow() - override val changes: SharedFlow get() = _changes + protected val changesInternal = MutableSharedFlow() + override val changes: SharedFlow get() = changesInternal - @OptIn(DelicateCoroutinesApi::class) override fun invalidate(propertyName: Name) { + //send update signal + @OptIn(DelicateCoroutinesApi::class) + (vision.manager?.context ?: GlobalScope).launch { + changesInternal.emit(propertyName) + } + + //notify children if there are any + if (vision is VisionGroup) { + vision.children.values.forEach { + it.properties.invalidate(propertyName) + } + } + + // update styles if (propertyName == Vision.STYLE_KEY) { vision.styles.asSequence() .mapNotNull { vision.getStyle(it) } @@ -217,9 +235,6 @@ public abstract class AbstractVisionProperties( invalidate(it.key.asName()) } } - (vision.manager?.context ?: GlobalScope).launch { - _changes.emit(propertyName) - } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index afdd686f..df0b9391 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -86,7 +86,9 @@ public abstract class VisionTagConsumer( ): T = div { id = resolveId(name) classes = setOf(OUTPUT_CLASS) - vision.setAsRoot(manager) + if (vision.parent == null) { + vision.setAsRoot(manager) + } attributes[OUTPUT_NAME_ATTRIBUTE] = name.toString() if (!outputMeta.isEmpty()) { //Hard-code output configuration diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index b7cec960..4d00f15b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -37,7 +37,7 @@ public fun Vision.useProperty( includeStyles: Boolean? = null, scope: CoroutineScope? = manager?.context, callBack: (Meta) -> Unit, -): Job = useProperty(propertyName.parseAsName(),inherit, includeStyles, scope, callBack) +): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callBack) public fun V.useProperty( property: KProperty1, diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 64f0d0b2..90c72b9b 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,9 +1,7 @@ package space.kscience.visionforge.meta -import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay +import kotlinx.coroutines.* import kotlinx.coroutines.flow.collectIndexed -import kotlinx.coroutines.launch import kotlinx.coroutines.test.runTest import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch @@ -20,6 +18,7 @@ private class TestScheme : Scheme() { companion object : SchemeSpec(::TestScheme) } +@OptIn(ExperimentalCoroutinesApi::class) internal class VisionPropertyTest { private val manager = Global.fetch(VisionManager) @@ -68,56 +67,63 @@ internal class VisionPropertyTest { val child = group.children["child"]!! - var value: Value? = null + val deferred: CompletableDeferred = CompletableDeferred() var callCounter = 0 - child.useProperty("test", inherit = true) { + val subscription = child.useProperty("test", inherit = true) { + deferred.complete(it.value) callCounter++ - value = it.value } - assertEquals(22, value?.int) + assertEquals(22, deferred.await()?.int) assertEquals(1, callCounter) child.properties.remove("test") - //Need this to avoid the race - delay(20) - assertEquals(11, child.properties.getProperty("test", inherit = true).int) - assertEquals(11, value?.int) - assertEquals(2, callCounter) +// assertEquals(11, deferred.await()?.int) +// assertEquals(2, callCounter) + subscription.cancel() } @Test fun testChildrenPropertyFlow() = runTest(dispatchTimeoutMs = 200) { val group = Global.fetch(VisionManager).group { + properties { "test" put 11 } + group("child") { properties { "test" put 22 } } + } val child = group.children["child"]!! launch { child.flowPropertyValue("test", inherit = true).collectIndexed { index, value -> - if (index == 0) { - assertEquals(22, value?.int) - } else if (index == 1) { - assertEquals(11, value?.int) - cancel() + when (index) { + 0 -> assertEquals(22, value?.int) + 1 -> assertEquals(11, value?.int) + 2 -> { + assertEquals(33, value?.int) + cancel() + } } } } + //wait for subscription to be created - delay(10) + delay(5) child.properties.remove("test") + + delay(50) + group.properties["test"] = 33 } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index d39f284c..8a0abcdb 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -45,7 +45,7 @@ public class FX3DPlugin : AbstractPlugin() { } public fun buildNode(obj: Solid): Node { - val binding = VisualObjectFXBinding(this, obj) + val binding = VisionFXBinding(this, obj) return when (obj) { is SolidReference -> referenceFactory(obj, binding) is SolidGroup -> { @@ -150,7 +150,7 @@ public interface FX3DFactory { public val type: KClass - public operator fun invoke(obj: T, binding: VisualObjectFXBinding): Node + public operator fun invoke(obj: T, binding: VisionFXBinding): Node public companion object { public const val TYPE: String = "fx3DFactory" diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt index 588f15cf..2e07527a 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt @@ -42,7 +42,7 @@ public class FXCompositeFactory(public val plugin: FX3DPlugin) : FX3DFactory get() = Composite::class - override fun invoke(obj: Composite, binding: VisualObjectFXBinding): Node { + override fun invoke(obj: Composite, binding: VisionFXBinding): Node { val first = plugin.buildNode(obj.first) as? MeshView ?: error("Can't build node") val second = plugin.buildNode(obj.second) as? MeshView ?: error("Can't build node") val firstCSG = first.toCSG() diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXConvexFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXConvexFactory.kt index 7bc44207..ddb342b0 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXConvexFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXConvexFactory.kt @@ -10,7 +10,7 @@ import kotlin.reflect.KClass public object FXConvexFactory : FX3DFactory { override val type: KClass get() = Convex::class - override fun invoke(obj: Convex, binding: VisualObjectFXBinding): Node { + override fun invoke(obj: Convex, binding: VisionFXBinding): Node { val hull = HullUtil.hull( obj.points.map { Vector3d.xyz(it.x.toDouble(), it.y.toDouble(), it.z.toDouble()) }, PropertyStorage() diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index 1c3ecb60..a75771cb 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -14,15 +14,17 @@ import kotlin.reflect.KClass public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { override val type: KClass get() = SolidReference::class - override fun invoke(obj: SolidReference, binding: VisualObjectFXBinding): Node { + override fun invoke(obj: SolidReference, binding: VisionFXBinding): Node { val prototype = obj.prototype val node = plugin.buildNode(prototype) - obj.onPropertyChange { name-> + obj.onPropertyChange { name -> if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { - val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") + val childName = name.firstOrNull()?.index?.let(Name::parse) + ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() - val referenceChild = obj.children.getChild(childName) ?: error("Reference child with name '$childName' not found") + val referenceChild = + obj.children.getChild(childName) ?: error("Reference child with name '$childName' not found") val child = node.findChild(childName) ?: error("Object child with name '$childName' not found") child.updateProperty(referenceChild, propertyName) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXShapeFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXShapeFactory.kt index 116075ce..d4d58db1 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXShapeFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXShapeFactory.kt @@ -11,7 +11,7 @@ import kotlin.reflect.KClass public object FXShapeFactory : FX3DFactory { override val type: KClass get() = GeometrySolid::class - override fun invoke(obj: GeometrySolid, binding: VisualObjectFXBinding): MeshView { + override fun invoke(obj: GeometrySolid, binding: VisionFXBinding): MeshView { val mesh = FXGeometryBuilder().apply { obj.toGeometry(this) }.build() return MeshView(mesh) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisionFXBinding.kt similarity index 96% rename from visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt rename to visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisionFXBinding.kt index 2eb2255c..cc4f3637 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisionFXBinding.kt @@ -12,7 +12,7 @@ import tornadofx.* /** * A caching binding collection for [Vision] properties */ -public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vision) { +public class VisionFXBinding(public val fx: FX3DPlugin, public val obj: Vision) { private val bindings = HashMap>() init { diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt index 976db192..34ab7d68 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt @@ -30,7 +30,7 @@ public class GdmlLoaderOptions { styleCache.getOrPut(Name.parse(name)) { Meta(builder) } - useStyle(name) + useStyle(name, false) } public fun Solid.transparent() { diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index f3527148..2e209c5c 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -352,7 +352,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val rootStyle by final.style("gdml") { Solid.ROTATION_ORDER_KEY put RotationOrder.ZXY } - final.useStyle(rootStyle) + final.useStyle(rootStyle, false) final.prototypes { proto.items.forEach { (token, item) -> diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 76eb56aa..1c123632 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -1,6 +1,9 @@ package space.kscience.visionforge.solid +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.* +import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -65,6 +68,25 @@ public class SolidReference( override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { return properties?.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) } + + override fun invalidate(propertyName: Name) { + //send update signal + @OptIn(DelicateCoroutinesApi::class) + (manager?.context ?: GlobalScope).launch { + changesInternal.emit(propertyName) + } + + // update styles + if (propertyName == Vision.STYLE_KEY) { + styles.asSequence() + .mapNotNull { getStyle(it) } + .flatMap { it.items.asSequence() } + .distinctBy { it.key } + .forEach { + invalidate(it.key.asName()) + } + } + } } } @@ -117,11 +139,11 @@ internal class SolidReferenceChild( includeStyles: Boolean?, ): Value? = own.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) - override fun setProperty(name: Name, node: Meta?) { + override fun setProperty(name: Name, node: Meta?, notify: Boolean) { own.setMeta(name, node) } - override fun setValue(name: Name, value: Value?) { + override fun setValue(name: Name, value: Value?, notify: Boolean) { own.setValue(name, value) } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt similarity index 92% rename from visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt rename to visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 5e26284e..6c9fc288 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string @@ -10,8 +11,9 @@ import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals +@OptIn(ExperimentalCoroutinesApi::class) @Suppress("UNUSED_VARIABLE") -class PropertyTest { +class SolidPropertyTest { @Test fun testColor() { val box = Box(10.0f, 10.0f, 10.0f) @@ -23,7 +25,6 @@ class PropertyTest { assertEquals("pink", box.color.string) } - @OptIn(ExperimentalCoroutinesApi::class) @Test fun testColorUpdate() = runTest(dispatchTimeoutMs = 200) { val box = Box(10.0f, 10.0f, 10.0f) @@ -31,11 +32,12 @@ class PropertyTest { val c = CompletableDeferred() - val subscription = box.onPropertyChange(this) { - if (it == SolidMaterial.MATERIAL_COLOR_KEY) { + val subscription = box.onPropertyChange(this) { key -> + if (key == SolidMaterial.MATERIAL_COLOR_KEY) { c.complete(box.color.string) } } + delay(5) box.material { color.set("pink") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 46df4405..b122f9c3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -27,7 +27,7 @@ public object ThreeLabelFactory : ThreeFactory { return Mesh(textGeo, ThreeMaterials.DEFAULT).apply { updateMaterial(obj) updatePosition(obj) - obj.onPropertyChange { _ -> + obj.onPropertyChange { //TODO three.logger.warn { "Label parameter change not implemented" } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index ea39bbea..a35ca12d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -43,7 +43,7 @@ public abstract class ThreeMeshFactory( } //add listener to object properties - obj.onPropertyChange { name -> + obj.onPropertyChange { name-> when { name.startsWith(Solid.GEOMETRY_KEY) -> { val oldGeometry = mesh.geometry diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 7c1358d7..c715efdb 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -11,6 +11,7 @@ import space.kscience.dataforge.meta.update import space.kscience.dataforge.names.* import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision +import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -68,7 +69,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { updatePosition(obj) //obj.onChildrenChange() - obj.properties.changes.onEach { name -> + obj.onPropertyChange(context) { name -> if ( name.startsWith(Solid.POSITION_KEY) || name.startsWith(Solid.ROTATION_KEY) || @@ -79,7 +80,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } else if (name == Vision.VISIBLE_KEY) { visible = obj.visible ?: true } - }.launchIn(context) + } obj.children.changes.onEach { childName -> val child = obj.children.getChild(childName) @@ -101,6 +102,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { }.launchIn(context) } } + is Composite -> compositeFactory.build(this, obj) else -> { //find specialized factory for this type if it is present @@ -179,6 +181,7 @@ internal fun Object3D.getOrCreateGroup(name: Name): Object3D { this.add(group) } } + else -> getOrCreateGroup(name.tokens.first().asName()).getOrCreateGroup(name.cutFirst()) } } -- 2.34.1 From 43362f51f5642941c16550043da99f9f0b525458 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 13 Aug 2022 20:47:03 +0300 Subject: [PATCH 084/143] Fix styling for Prototypes --- .../ThreeViewWithControls.kt | 11 +++-- .../space/kscience/visionforge/StyleSheet.kt | 6 +-- .../kscience/visionforge/VisionProperties.kt | 10 +++-- .../visionforge/solid/SolidReference.kt | 43 ++++++++++++++----- 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index babafb2e..883b621d 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -5,7 +5,9 @@ import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.css.* import react.* +import react.dom.b import react.dom.div +import react.dom.p import react.dom.span import ringui.* import space.kscience.dataforge.context.Context @@ -14,14 +16,11 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length -import space.kscience.visionforge.Vision +import space.kscience.visionforge.* import space.kscience.visionforge.react.* -import space.kscience.visionforge.root -import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.visionManager import styled.css import styled.styledDiv @@ -184,6 +183,10 @@ public val ThreeCanvasWithControls: FC = fc("Three } } } + p { + b { +"Styles: " } + +vision.styles.joinToString(separator = ", ") + } } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 11e76d0c..9db79e19 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -67,11 +67,7 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = properties.getValue( - Vision.STYLE_KEY, - inherit = true, - includeStyles = false, - )?.stringList ?: emptyList() + get() = properties.getValue(Vision.STYLE_KEY, inherit = false, includeStyles = false)?.stringList ?: emptyList() set(value) { properties.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index c15c6c55..fd7befdf 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -167,16 +167,18 @@ public abstract class AbstractVisionProperties( inherit: Boolean?, includeStyles: Boolean?, ): Value? { + own?.get(name)?.value?.let { return it } + val descriptor = descriptor?.get(name) - val inheritFlag = inherit ?: descriptor?.inherited ?: false val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true - own?.get(name)?.value?.let { return it } if (stylesFlag) { vision.getStyleProperty(name)?.value?.let { return it } } + + val inheritFlag = inherit ?: descriptor?.inherited ?: false if (inheritFlag) { - vision.parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } + vision.parent?.properties?.getValue(name, inheritFlag, stylesFlag)?.let { return it } } return descriptor?.defaultValue } @@ -208,7 +210,7 @@ public abstract class AbstractVisionProperties( } @Transient - protected val changesInternal = MutableSharedFlow() + protected val changesInternal: MutableSharedFlow = MutableSharedFlow() override val changes: SharedFlow get() = changesInternal override fun invalidate(propertyName: Name) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 1c123632..2cf90987 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -9,6 +9,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.names.* import space.kscience.visionforge.* import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties @@ -59,16 +60,41 @@ public class SolidReference( propertiesInternal = value } - override val own: Meta? get() = properties - - override fun getProperty(name: Name, inherit: Boolean?, includeStyles: Boolean?): MutableMeta { - return properties?.getMeta(name) ?: prototype.properties.getProperty(name, inherit, includeStyles) - } - override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { - return properties?.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) + if(name == Vision.STYLE_KEY){ + return buildList { + properties?.getValue(Vision.STYLE_KEY)?.list?.forEach { + add(it) + } + prototype.styles.forEach { + add(it.asValue()) + } + }.distinct().asValue() + } + properties?.getValue(name)?.let { return it } + + val descriptor = descriptor?.get(name) + val inheritFlag = inherit ?: descriptor?.inherited ?: false + val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true + + if (stylesFlag) { + getStyleProperty(name)?.value?.let { return it } + } + + if (inheritFlag) { + parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } + } + + prototype.properties.getValue(name, inheritFlag, stylesFlag)?.let { return it } + + if(inheritFlag){ + parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } + } + + return null } + override fun invalidate(propertyName: Name) { //send update signal @OptIn(DelicateCoroutinesApi::class) @@ -130,9 +156,6 @@ internal class SolidReferenceChild( override val own: MutableMeta by lazy { owner.properties.getProperty(childToken(childName).asName()) } - override fun getProperty(name: Name, inherit: Boolean?, includeStyles: Boolean?): MutableMeta = - own.getMeta(name) ?: prototype.properties.getProperty(name, inherit, includeStyles) - override fun getValue( name: Name, inherit: Boolean?, -- 2.34.1 From eeec89f0e678b9fffb42c3f208484745da8dd5e4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 10:47:36 +0300 Subject: [PATCH 085/143] Fix property editor --- build.gradle.kts | 7 +++++- settings.gradle.kts | 1 + .../bootstrap/visionPropertyEditor.kt | 13 +++++----- ui/react/build.gradle.kts | 4 --- .../visionforge/react/MultiSelectChooser.kt | 4 +-- .../visionforge/react/PropertyEditor.kt | 15 +++++++---- .../visionforge/react/RangeValueChooser.kt | 18 +++++++------ .../visionforge/react/valueChooser.kt | 25 ++++++++++--------- .../ThreeViewWithControls.kt | 8 +++--- .../solid/three/ThreeCanvasLabelFactory.kt | 2 +- 10 files changed, 55 insertions(+), 42 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f2c4e6d5..4c76b98f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,4 +37,9 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") \ No newline at end of file +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") + + +//rootProject.extensions.configure { +// versions.webpackCli.version = "4.10.0" +//} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 4215d150..9bdf544a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,7 @@ pluginManagement { maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } plugins { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index b82d48fe..5e30f838 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -5,7 +5,7 @@ import react.RBuilder import react.dom.client.createRoot import react.key import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isEmpty import space.kscience.visionforge.Vision import space.kscience.visionforge.getStyle import space.kscience.visionforge.react.EditorPropertyState @@ -23,17 +23,18 @@ public fun RBuilder.visionPropertyEditor( ) { card("Properties") { - child(PropertyEditor){ - attrs{ + child(PropertyEditor) { + attrs { this.key = key?.toString() this.meta = vision.properties.root() this.updates = vision.properties.changes this.descriptor = descriptor this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") - this.getPropertyState = {name-> - if(vision.properties.own?.get(name)!= null){ + this.getPropertyState = { name -> + val ownMeta = vision.properties.own?.getMeta(name) + if (ownMeta != null && !ownMeta.isEmpty()) { EditorPropertyState.Defined - } else if(vision.properties.root()[name] != null){ + } else if (vision.properties.root().getValue(name) != null) { // TODO differentiate EditorPropertyState.Default() } else { diff --git a/ui/react/build.gradle.kts b/ui/react/build.gradle.kts index 1a58d333..acbe40cb 100644 --- a/ui/react/build.gradle.kts +++ b/ui/react/build.gradle.kts @@ -8,8 +8,4 @@ dependencies{ api("org.jetbrains.kotlin-wrappers:kotlin-react-dom") // implementation(npm("react-select","4.3.0")) implementation(project(":visionforge-threejs")) -} - -rootProject.extensions.configure { - versions.webpackCli.version = "4.10.0" } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index fb339429..fc635d21 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -19,13 +19,13 @@ public val MultiSelectChooser: FC = fc("MultiSelectChooser") val onChange: (Event) -> Unit = { event: Event -> val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } - props.meta.value = newSelected.asValue() + props.onValueChange(newSelected.asValue()) } select { attrs { multiple = true - values = (props.meta.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } + values = (props.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } onChangeFunction = onChange } props.descriptor?.allowedValues?.forEach { optionValue -> diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index ca64fd07..f5d28f19 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -73,8 +73,8 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } val descriptor: MetaDescriptor? = useMemo(props.descriptor, props.name) { props.descriptor?.get(props.name) } var property: MutableMeta by useState { props.meta.getOrCreate(props.name) } + var editorPropertyState: EditorPropertyState by useState { props.getPropertyState(props.name) } - val defined = props.getPropertyState(props.name) == EditorPropertyState.Defined val keys = useMemo(descriptor) { buildSet { @@ -91,6 +91,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { fun update() { property = props.meta.getOrCreate(props.name) + editorPropertyState = props.getPropertyState(props.name) } useEffect(props.meta) { @@ -136,7 +137,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { styledSpan { css { +TreeStyles.treeLabel - if (!defined) { + if (editorPropertyState != EditorPropertyState.Defined) { +TreeStyles.treeLabelInactive } } @@ -152,8 +153,12 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { ValueChooser { attrs { this.descriptor = descriptor - this.meta = property - this.state = props.getPropertyState(props.name) + this.state = editorPropertyState + this.value = property.value + this.onValueChange = { + property.value = it + editorPropertyState = props.getPropertyState(props.name) + } } } } @@ -177,7 +182,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +"\u00D7" attrs { - if (!defined) { + if (editorPropertyState!= EditorPropertyState.Defined) { disabled = true } else { onClickFunction = removeClick diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index ae6386d9..309e4b7f 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -20,22 +20,24 @@ import styled.styledInput @JsExport public val RangeValueChooser: FC = fc("RangeValueChooser") { props -> - var innerValue by useState(props.meta.double) - var rangeDisabled: Boolean by useState(props.meta.value == null) + var innerValue by useState(props.value?.double) + var rangeDisabled: Boolean by useState(props.state != EditorPropertyState.Defined) val handleDisable: (Event) -> Unit = { val checkBoxValue = (it.target as HTMLInputElement).checked rangeDisabled = !checkBoxValue - props.meta.value = if (!checkBoxValue) { - null - } else { - innerValue?.asValue() - } + props.onValueChange( + if (!checkBoxValue) { + null + } else { + innerValue?.asValue() + } + ) } val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).value - props.meta.value = newValue.toDoubleOrNull()?.asValue() + props.onValueChange(newValue.toDoubleOrNull()?.asValue()) innerValue = newValue.toDoubleOrNull() } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 75cd3a0c..7ba72e1c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -27,17 +27,18 @@ import styled.styledSelect public external interface ValueChooserProps : Props { public var descriptor: MetaDescriptor? - public var meta: MutableMeta public var state: EditorPropertyState + public var value: Value? + public var onValueChange: (Value?) -> Unit } @JsExport public val StringValueChooser: FC = fc("StringValueChooser") { props -> - var value by useState(props.meta.string ?: "") + var value by useState(props.value?.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { value = (event.target as HTMLInputElement).value - props.meta.value = value.asValue() + props.onValueChange(value.asValue()) } } val handleChange: (Event) -> Unit = { @@ -59,7 +60,7 @@ public val StringValueChooser: FC = fc("StringValueChooser") public val BooleanValueChooser: FC = fc("BooleanValueChooser") { props -> val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).checked - props.meta.value = newValue.asValue() + props.onValueChange(newValue.asValue()) } styledInput(type = InputType.checkBox) { css { @@ -67,7 +68,7 @@ public val BooleanValueChooser: FC = fc("BooleanValueChooser" } attrs { //this.attributes["indeterminate"] = (props.item == null).toString() - checked = props.meta.boolean ?: false + checked = props.value?.boolean ?: false onChangeFunction = handleChange } } @@ -75,7 +76,7 @@ public val BooleanValueChooser: FC = fc("BooleanValueChooser" @JsExport public val NumberValueChooser: FC = fc("NumberValueChooser") { props -> - var innerValue by useState(props.meta.string ?: "") + var innerValue by useState(props.value?.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { innerValue = (event.target as HTMLInputElement).value @@ -83,7 +84,7 @@ public val NumberValueChooser: FC = fc("NumberValueChooser") if (number == null) { console.error("The input value $innerValue is not a number") } else { - props.meta.value = number.asValue() + props.onValueChange(number.asValue()) } } } @@ -113,10 +114,10 @@ public val NumberValueChooser: FC = fc("NumberValueChooser") @JsExport public val ComboValueChooser: FC = fc("ComboValueChooser") { props -> - var selected by useState(props.meta.string ?: "") + var selected by useState(props.value?.string ?: "") val handleChange: (Event) -> Unit = { selected = (it.target as HTMLSelectElement).value - props.meta.value = selected.asValue() + props.onValueChange(selected.asValue()) } styledSelect { css { @@ -128,7 +129,7 @@ public val ComboValueChooser: FC = fc("ComboValueChooser") { } } attrs { - this.value = props.meta.string ?: "" + this.value = props.value?.string ?: "" multiple = false onChangeFunction = handleChange } @@ -138,7 +139,7 @@ public val ComboValueChooser: FC = fc("ComboValueChooser") { @JsExport public val ColorValueChooser: FC = fc("ColorValueChooser") { props -> val handleChange: (Event) -> Unit = { - props.meta.value = (it.target as HTMLInputElement).value.asValue() + props.onValueChange((it.target as HTMLInputElement).value.asValue()) } styledInput(type = InputType.color) { css { @@ -146,7 +147,7 @@ public val ColorValueChooser: FC = fc("ColorValueChooser") { margin(0.px) } attrs { - this.value = props.meta.value?.let { value -> + this.value = props.value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) else value.string } ?: "#000000" diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 883b621d..c1344569 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -183,9 +183,11 @@ public val ThreeCanvasWithControls: FC = fc("Three } } } - p { - b { +"Styles: " } - +vision.styles.joinToString(separator = ", ") + vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> + p { + b { +"Styles: " } + +styles.joinToString(separator = ", ") + } } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index d33c7e79..8b4e823b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -26,7 +26,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).value ?: "black" + context.fillStyle = obj.properties.getValue(SolidMaterial.MATERIAL_COLOR_KEY, false, true)?.value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() -- 2.34.1 From 34fbb23c60bd82c70ae2070b1f9c6506703f6b11 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 12:52:18 +0300 Subject: [PATCH 086/143] Cleanup vision root rules --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 9 ++++---- .../npm/root/serialization/rootToSolid.kt | 7 +++--- .../visionforge/gdml/demo/GDMLAppComponent.kt | 12 ++++------ .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 4 +++- .../src/main/kotlin/JsPlaygroundApp.kt | 5 +++-- .../src/main/kotlin/gravityDemo.kt | 7 +++--- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 12 +++++----- .../src/jvmMain/kotlin/formServer.kt | 2 +- .../src/jvmMain/kotlin/rootParser.kt | 4 ++-- demo/sat-demo/build.gradle.kts | 2 +- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 8 +++---- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 7 +++++- .../kscience/visionforge/solid/demo/demo.kt | 9 ++++---- gradle.properties | 2 +- .../ThreeViewWithControls.kt | 9 +++++--- .../ThreeWithControlsPlugin.kt | 2 +- .../space/kscience/visionforge/VisionGroup.kt | 9 ++++---- .../kscience/visionforge/VisionClient.kt | 1 + .../kscience/visionforge/gdml/gdmlLoader.kt | 2 +- .../kscience/visionforge/solid/Composite.kt | 4 ++-- .../kscience/visionforge/solid/SolidGroup.kt | 15 +++++++------ .../visionforge/solid/SolidReference.kt | 22 ++++++++++++------- .../kscience/visionforge/solid/Solids.kt | 20 +++++++++++++++-- .../visionforge/solid/CompositeTest.kt | 2 +- .../kscience/visionforge/solid/ConvexTest.kt | 2 +- .../kscience/visionforge/solid/GroupTest.kt | 2 +- .../visionforge/solid/SerializationTest.kt | 4 ++-- .../visionforge/solid/SolidPluginTest.kt | 2 +- .../visionforge/solid/SolidPropertyTest.kt | 12 +++++----- .../visionforge/solid/SolidReferenceTest.kt | 2 +- .../visionforge/solid/VisionUpdateTest.kt | 6 ++--- 31 files changed, 119 insertions(+), 87 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index b7b79b51..af185db3 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -6,6 +6,7 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.isEmpty import space.kscience.visionforge.set import space.kscience.visionforge.solid.* @@ -262,7 +263,7 @@ private fun SolidGroup.addShape( val fShape by shape.dObject(::DGeoShape) val fScale by shape.dObject(::DGeoScale) fShape?.let { scaledShape -> - group(name?.let { Name.parse(it) }) { + solidGroup(name?.let { Name.parse(it) }) { scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) addShape(scaledShape, context) apply(block) @@ -294,7 +295,7 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { } private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { - val group = SolidGroup { + val group = SolidGroup().apply { //set current layer layer = context.currentLayer val nodes = volume.fNodes @@ -372,9 +373,9 @@ private fun SolidGroup.addRootVolume( } } -public fun DGeoManager.toSolid(): SolidGroup = SolidGroup { +public fun MutableVisionContainer.rootGeo(dGeoManager: DGeoManager): SolidGroup = solidGroup { val context = RootToSolidContext(this) - fNodes.forEach { node -> + dGeoManager.fNodes.forEach { node -> addRootNode(node, context) } } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt index 4483afcb..50a4002a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.root.serialization import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus +import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.solid.* import kotlin.math.PI import kotlin.math.atan2 @@ -132,7 +133,7 @@ private fun buildGroup(volume: TGeoVolume): SolidGroup { return if (volume is TGeoVolumeAssemblyRef) { buildGroup(volume.value) } else { - SolidGroup { + SolidGroup().apply { volume.fShape?.let { addShape(it) } volume.fNodes?.let { it.arr.forEach { obj -> @@ -180,8 +181,8 @@ private fun SolidGroup.volume(volume: TGeoVolume, name: String? = null, cache: B // } -public fun TGeoManager.toSolid(): SolidGroup = SolidGroup { - fNodes.arr.forEach { +public fun MutableVisionContainer.rootGeo(tGeoManager: TGeoManager): SolidGroup = solidGroup { + tGeoManager.fNodes.arr.forEach { node(it) } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 8f605ccd..4301966a 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -10,10 +10,7 @@ import org.w3c.files.get import react.Props import react.dom.h2 import react.fc -import react.useMemo import react.useState -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.Name import space.kscience.gdml.Gdml import space.kscience.gdml.decodeFromString @@ -31,14 +28,13 @@ import styled.css import styled.styledDiv external interface GDMLAppProps : Props { - var context: Context + var solids: Solids var vision: Solid? var selected: Name? } @JsExport val GDMLApp = fc("GDMLApp") { props -> - val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } var deferredVision: Deferred by useState { CompletableDeferred(props.vision) } @@ -53,7 +49,7 @@ val GDMLApp = fc("GDMLApp") { props -> name.endsWith(".gdml") || name.endsWith(".xml") -> { val gdml = Gdml.decodeFromString(data) gdml.toVision().apply { - setAsRoot(visionManager) + setAsRoot(props.solids.visionManager) console.info("Marking layers for file $name") markLayers() ambientLight { @@ -61,7 +57,7 @@ val GDMLApp = fc("GDMLApp") { props -> } } } - name.endsWith(".json") -> visionManager.decodeFromString(data) + name.endsWith(".json") -> props.solids.visionManager.decodeFromString(data) else -> { window.alert("File extension is not recognized: $name") error("File extension is not recognized: $name") @@ -82,7 +78,7 @@ val GDMLApp = fc("GDMLApp") { props -> } child(ThreeCanvasWithControls) { attrs { - this.context = props.context + this.solids = props.solids this.builderOfSolid = deferredVision this.selected = props.selected tab("Load") { diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index d4a80876..ab2b35e0 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -4,11 +4,13 @@ import kotlinx.browser.document import kotlinx.css.* import react.dom.client.createRoot import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.react.render +import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.three.ThreePlugin @@ -52,7 +54,7 @@ private class GDMLDemoApp : Application { } //println(context.plugins.fetch(VisionManager).encodeToString(vision)) attrs { - this.context = context + this.solids = context.fetch(Solids) this.vision = vision } } diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index c31b48e0..1ee7e013 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -4,6 +4,7 @@ import react.dom.client.createRoot import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application @@ -51,7 +52,7 @@ private class JsPlaygroundApp : Application { Tab("gravity") { GravityDemo { attrs { - this.context = playgroundContext + this.solids = playgroundContext.fetch(Solids) } } } @@ -72,7 +73,7 @@ private class JsPlaygroundApp : Application { child(ThreeCanvasWithControls) { val random = Random(112233) attrs { - context = playgroundContext + solids = playgroundContext.fetch(Solids) solid { ambientLight { color.set(Colors.white) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index 3bdd574c..c04baf98 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -4,7 +4,6 @@ import kotlinx.coroutines.launch import kotlinx.css.* import react.Props import react.fc -import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.Colors @@ -18,7 +17,7 @@ import styled.styledDiv import kotlin.math.sqrt external interface DemoProps : Props { - var context: Context + var solids: Solids } val GravityDemo = fc { props -> @@ -40,7 +39,7 @@ val GravityDemo = fc { props -> } child(ThreeCanvasWithControls) { attrs { - context = props.context + solids = props.solids solid { pointLight(200, 200, 200, name = "light"){ color.set(Colors.white) @@ -52,7 +51,7 @@ val GravityDemo = fc { props -> color.set("red") val h = 100.0 y = h - context.launch { + solids.context.launch { val g = 10.0 val dt = 0.1 var time = 0.0 diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index aeb0abd3..cf8caf80 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -15,7 +15,7 @@ class Model(val manager: VisionManager) { private val events = HashSet() private fun MutableVisionContainer.pixel(pixel: SC1) { - val group = group(pixel.name) { + val group = solidGroup(pixel.name) { position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z) box(pixel.xSize, pixel.ySize, pixel.zSize) label(pixel.name) { @@ -27,7 +27,7 @@ class Model(val manager: VisionManager) { } private fun SolidGroup.detector(detector: SC16) { - group(detector.name) { + solidGroup(detector.name) { detector.pixels.forEach { pixel(it) } @@ -42,24 +42,24 @@ class Model(val manager: VisionManager) { color.set("darkgreen") } rotationX = PI / 2 - group("bottom") { + solidGroup("bottom") { Monitor.detectors.filter { it.center.z == LOWER_LAYER_Z }.forEach { detector(it) } } - group("middle") { + solidGroup("middle") { Monitor.detectors.filter { it.center.z == CENTRAL_LAYER_Z }.forEach { detector(it) } } - group("top") { + solidGroup("top") { Monitor.detectors.filter { it.center.z == UPPER_LAYER_Z }.forEach { detector(it) } } - tracks = group("tracks") + tracks = solidGroup("tracks") } private fun highlight(pixel: String) { diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index accd1a16..7397b6b6 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -49,7 +49,7 @@ fun main() { } vision("form") { form } - form.onPropertyChange { _, _ -> + form.onPropertyChange { println(this) } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index f88793ee..1a4330f4 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.examples import ru.mipt.npm.root.DGeoManager +import ru.mipt.npm.root.rootGeo import ru.mipt.npm.root.serialization.TGeoManager -import ru.mipt.npm.root.toSolid import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf @@ -34,7 +34,7 @@ fun main() { println(it) } - val solid = geo.toSolid() + val solid = Solids.rootGeo(geo) Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid)) diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index e12b730f..870f3388 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -15,7 +15,7 @@ group = "ru.mipt.npm" dependencies{ implementation(project(":visionforge-threejs:visionforge-threejs-server")) - implementation("ch.qos.logback:logback-classic:1.2.3") + implementation("ch.qos.logback:logback-classic:1.2.11") } application { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index 631d70f8..052fb6e0 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -6,7 +6,7 @@ import space.kscience.visionforge.style import space.kscience.visionforge.useStyle import kotlin.math.PI -internal fun visionOfSatellite( +internal fun Solids.visionOfSatellite( layers: Int = 10, layerHeight: Number = 10, xSegments: Int = 3, @@ -14,7 +14,7 @@ internal fun visionOfSatellite( xSegmentSize: Number = 30, ySegmentSize: Number = xSegmentSize, fiberDiameter: Number = 1.0, -): SolidGroup = SolidGroup { +): SolidGroup = solidGroup { color.set("darkgreen") val transparent by style { this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3 @@ -31,7 +31,7 @@ internal fun visionOfSatellite( val totalXSize = xSegments * xSegmentSize.toDouble() val totalYSize = ySegments * ySegmentSize.toDouble() for (layer in 1..layers) { - group("layer[$layer]") { + solidGroup("layer[$layer]") { for (i in 1..xSegments) { for (j in 1..ySegments) { box(xSegmentSize, ySegmentSize, layerHeight, name = "segment[$i,$j]") { @@ -42,7 +42,7 @@ internal fun visionOfSatellite( } } } - group("fibers") { + solidGroup("fibers") { for (i in 1..xSegments) { cylinder(fiberDiameter, totalYSize) { useStyle(red) diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index d601a74b..41ac4d2f 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -5,6 +5,8 @@ import kotlinx.coroutines.* import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.plus @@ -17,13 +19,16 @@ import space.kscience.visionforge.visionManager import kotlin.random.Random +@OptIn(DFExperimental::class) fun main() { val satContext = Context("sat") { plugin(Solids) } + val solids = satContext.fetch(Solids) + //Create a geometry - val sat = visionOfSatellite(ySegments = 3) + val sat = solids.visionOfSatellite(ySegments = 3) val server = satContext.visionManager.serve { page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 88c6d154..0398c6bf 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -5,7 +5,6 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -19,11 +18,11 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro val meta = Meta { "title" put title } - val vision = SolidGroup(block).apply { + val vision = solids.solidGroup { + block() ambientLight{ color.set(Colors.white) } - setAsRoot(solids.visionManager) } render(Name.parse(name), vision, meta) } @@ -69,7 +68,7 @@ fun VisionLayout.showcase() { } demo("dynamic", "Dynamic properties") { - val group = group { + val group = solidGroup { box(100, 100, 100) { z = 110.0 opacity = 0.5 @@ -101,7 +100,7 @@ fun VisionLayout.showcase() { demo("rotation", "Rotations") { box(100, 100, 100) - group { + solidGroup { x = 200 rotationY = PI / 4 box(100, 100, 100) { diff --git a/gradle.properties b/gradle.properties index aeb2ca21..668f0f5d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false -#kotlin.incremental.js.ir=true +kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index c1344569..3b7133e9 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -10,7 +10,6 @@ import react.dom.div import react.dom.p import react.dom.span import ringui.* -import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -20,21 +19,25 @@ import space.kscience.visionforge.* import space.kscience.visionforge.react.* import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup +import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.solidGroup import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv public external interface ThreeCanvasWithControlsProps : Props { - public var context: Context + public var solids: Solids public var builderOfSolid: Deferred public var selected: Name? public var options: Canvas3DOptions? public var additionalTabs: Map Unit>? } +private val ThreeCanvasWithControlsProps.context get() = solids.context + public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { builderOfSolid = context.async { - SolidGroup(block) + solids.solidGroup(null, block) } } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index bf1a2160..191742ca 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -29,7 +29,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { createRoot(element).render { child(ThreeCanvasWithControls) { attrs { - this.context = this@ThreeWithControlsPlugin.context + this.solids = three.solids this.builderOfSolid = context.async { vision as Solid} } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 613a5dfe..01786453 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -8,6 +8,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus import space.kscience.visionforge.Vision.Companion.STYLE_KEY @@ -95,19 +96,19 @@ public class SimpleVisionGroup : AbstractVisionGroup(), MutableVisionContainer.group( +public inline fun MutableVisionContainer.group( name: Name? = null, builder: SimpleVisionGroup.() -> Unit = {}, -): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } +): SimpleVisionGroup = SimpleVisionGroup().also { setChild(name, it) }.apply(builder) /** * Define a group with given [name], attach it to this parent and return it. */ @VisionBuilder -public fun MutableVisionContainer.group( +public inline fun MutableVisionContainer.group( name: String, builder: SimpleVisionGroup.() -> Unit = {}, -): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } +): SimpleVisionGroup = group(name.parseAsName(), builder) //fun VisualObject.findStyle(styleName: Name): Meta? { // if (this is VisualGroup) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 41018759..41e3b8e6 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -65,6 +65,7 @@ public class VisionClient : AbstractPlugin() { private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { + vision.setAsRoot(visionManager) val renderer = findRendererFor(vision) ?: error("Could not find renderer for ${visionManager.encodeToString(vision)}") renderer.render(element, vision, outputMeta) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 2e209c5c..18e2640e 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -29,7 +29,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { */ private val proto = SolidGroup() - private val solids = proto.group(solidsName) { + private val solids = proto.solidGroup(solidsName) { properties["edges.enabled"] = false } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 1c28025c..7c6ab3ec 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -26,7 +26,7 @@ public inline fun MutableVisionContainer.composite( name: String? = null, @VisionBuilder builder: SolidGroup.() -> Unit, ): Composite { - val group = SolidGroup(builder) + val group = SolidGroup().apply(builder) val children = group.items.values.toList() if (children.size != 2) { error("Composite requires exactly two children, but found ${children.size}") @@ -48,7 +48,7 @@ public fun SolidGroup.smartComposite( name: String? = null, @VisionBuilder builder: SolidGroup.() -> Unit, ): Solid = if (type == CompositeType.GROUP) { - val group = SolidGroup(builder) + val group = SolidGroup().apply(builder) if (name == null && group.properties.own == null) { //append directly to group if no properties are defined group.items.forEach { (_, value) -> diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index f3ca4cf8..a089bf4d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.* @@ -30,7 +31,8 @@ public interface PrototypeHolder { */ @Serializable @SerialName("group.solid") -public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, MutableVisionContainer { +public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, + MutableVisionContainer { public val items: Map get() = children.keys.mapNotNull { @@ -79,19 +81,18 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable } } -public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) - @VisionBuilder -public fun MutableVisionContainer.group( +public inline fun MutableVisionContainer.solidGroup( name: Name? = null, builder: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup(builder).also { setChild(name, it) } +): SolidGroup = SolidGroup().also { setChild(name, it) }.apply(builder) +//root first, update later /** * Define a group with given [name], attach it to this parent and return it. */ @VisionBuilder -public fun MutableVisionContainer.group( +public inline fun MutableVisionContainer.solidGroup( name: String, action: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup(action).also { setChild(name, it) } +): SolidGroup = solidGroup(name.parseAsName(), action) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 2cf90987..07398a42 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -71,24 +71,30 @@ public class SolidReference( } }.distinct().asValue() } + //1. resolve own properties properties?.getValue(name)?.let { return it } val descriptor = descriptor?.get(name) val inheritFlag = inherit ?: descriptor?.inherited ?: false val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true - if (stylesFlag) { - getStyleProperty(name)?.value?.let { return it } - } - - if (inheritFlag) { - parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it } - } - + //2. Resolve prototype onw properties prototype.properties.getValue(name, inheritFlag, stylesFlag)?.let { return it } + if (stylesFlag) { + //3. own styles + own?.getValue(Vision.STYLE_KEY)?.list?.forEach { styleName -> + getStyle(styleName.string)?.getValue(name)?.let { return it } + } + //4. prototype styles + prototype.getStyleProperty(name)?.value?.let { return it } + } + if(inheritFlag){ + //5. own inheritance parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } + //6. prototype inheritance + prototype.parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } } return null diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 722c97f8..43640182 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -10,22 +10,34 @@ import kotlinx.serialization.serializer import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput import kotlin.reflect.KClass -public class Solids(meta: Meta) : VisionPlugin(meta) { +public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer { override val tag: PluginTag get() = Companion.tag override val visionSerializersModule: SerializersModule get() = serializersModuleForSolids - public companion object : PluginFactory { + override fun setChild(name: Name?, child: Solid?) { + child?.setAsRoot(visionManager) + } + + public companion object : PluginFactory, MutableVisionContainer { override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) override val type: KClass = Solids::class + public val default: Solids by lazy { + Context("@Solids"){ + plugin(Solids) + }.fetch(Solids) + } + override fun build(context: Context, meta: Meta): Solids = Solids(meta) private fun PolymorphicModuleBuilder.solids() { @@ -68,6 +80,10 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { public fun decodeFromString(str: String): Solid = jsonForSolids.decodeFromString(PolymorphicSerializer(Solid::class), str) + + override fun setChild(name: Name?, child: Solid?) { + default.setChild(name, child) + } } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt index 17dfb925..779a1b27 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt @@ -8,7 +8,7 @@ class CompositeTest { @Test fun testCompositeBuilder(){ lateinit var composite: Composite - SolidGroup { + Solids.solidGroup { composite = composite(CompositeType.INTERSECT) { y = 300 box(100, 100, 100) { diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt index 500bddb2..e78dc12c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt @@ -11,7 +11,7 @@ class ConvexTest { @Suppress("UNUSED_VARIABLE") @Test fun testConvexBuilder() { - val group = SolidGroup{ + val group = Solids.solidGroup { convex { point(50, 50, -50) point(50, -50, -50) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt index 013a8d4c..b486f723 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt @@ -9,7 +9,7 @@ import kotlin.test.assertEquals class GroupTest { @Test fun testGroupWithComposite() { - val group = SolidGroup{ + val group = Solids.solidGroup{ union("union") { box(100, 100, 100) { z = 100 diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 49c90dab..45d1a737 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -41,7 +41,7 @@ class SerializationTest { x = 100 z = -100 } - val group = SolidGroup { + val group = Solids.solidGroup { newRef("cube", cube) refGroup("pg", Name.parse("pg.content")) { sphere(50) { @@ -57,7 +57,7 @@ class SerializationTest { @Test fun lightSerialization(){ - val group = SolidGroup { + val group = Solids.solidGroup { ambientLight { color.set(Colors.white) intensity = 100.0 diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt index d60b9042..ad9a06e9 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt @@ -8,7 +8,7 @@ import kotlin.test.Test import kotlin.test.assertEquals class SolidPluginTest { - val vision = SolidGroup { + val vision = Solids.solidGroup { box(100, 100, 100, name = "aBox") sphere(100, name = "aSphere") { diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 6c9fc288..2859019b 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -52,7 +52,7 @@ class SolidPropertyTest { var box: Box? = null val group = SolidGroup().apply { properties["test"] = 22 - group { + solidGroup { box = box(100, 100, 100) } } @@ -62,13 +62,13 @@ class SolidPropertyTest { @Test fun testStyleProperty() { var box: Box? = null - val group = SolidGroup { + val group = Solids.solidGroup { styleSheet { update("testStyle") { "test" put 22 } } - group { + solidGroup { box = box(100, 100, 100) { useStyle("testStyle") } @@ -86,7 +86,7 @@ class SolidPropertyTest { SolidMaterial.MATERIAL_COLOR_KEY put "#555555" } } - group { + solidGroup { box = box(100, 100, 100) { useStyle("testStyle") } @@ -98,7 +98,7 @@ class SolidPropertyTest { @Test fun testReferenceStyleProperty() { var box: SolidReference? = null - val group = SolidGroup { + val group = Solids.solidGroup { styleSheet { update("testStyle") { SolidMaterial.MATERIAL_COLOR_KEY put "#555555" @@ -109,7 +109,7 @@ class SolidPropertyTest { styles = listOf("testStyle") } } - group { + solidGroup { box = ref("box".asName()) } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index 027f8b03..021a4b73 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -11,7 +11,7 @@ import kotlin.test.assertEquals @DFExperimental class SolidReferenceTest { - val groupWithReference = SolidGroup { + val groupWithReference = Solids.solidGroup { val theStyle by style { SolidMaterial.MATERIAL_COLOR_KEY put "red" } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 2cf5c861..65fdf373 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -17,11 +17,11 @@ internal class VisionUpdateTest { @Test fun testVisionUpdate(){ - val targetVision = SolidGroup { + val targetVision = Solids.solidGroup { box(200,200,200, name = "origin") } val dif = visionManager.VisionChange{ - group ("top") { + solidGroup ("top") { color.set(123) box(100,100,100) } @@ -37,7 +37,7 @@ internal class VisionUpdateTest { @Test fun testVisionChangeSerialization(){ val change = visionManager.VisionChange{ - group("top") { + solidGroup("top") { color.set(123) box(100,100,100) } -- 2.34.1 From 846e87a44b57d2991ca3ae814082aa6c01c1f414 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 14:25:44 +0300 Subject: [PATCH 087/143] Fix flaky properties test --- .../mipt/npm/muon/monitor/MMAppComponent.kt | 8 ++++---- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 3 ++- .../visionforge/meta/VisionPropertyTest.kt | 20 +++++++------------ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 20a33fe2..3ecb7f9f 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -16,7 +16,6 @@ import react.dom.p import react.fc import react.useMemo import react.useState -import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors @@ -24,6 +23,7 @@ import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab +import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.specifications.Canvas3DOptions @@ -35,7 +35,7 @@ import kotlin.math.PI external interface MMAppProps : Props { var model: Model - var context: Context + var solids: Solids var selected: Name? } @@ -71,7 +71,7 @@ val MMApp = fc("Muon monitor") { props -> } child(ThreeCanvasWithControls) { attrs { - this.context = props.context + this.solids = props.solids this.builderOfSolid = CompletableDeferred(root) this.selected = props.selected this.options = mmOptions @@ -82,7 +82,7 @@ val MMApp = fc("Muon monitor") { props -> +"Next" attrs { onClickFunction = { - context.launch { + solids.context.launch { val event = window.fetch( "http://localhost:8080/event", RequestInit("GET") diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 9c96ad07..4b18291b 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -7,6 +7,7 @@ import space.kscience.dataforge.context.fetch import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager import space.kscience.visionforge.react.render +import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -27,7 +28,7 @@ private class MMDemoApp : Application { child(MMApp) { attrs { this.model = model - this.context = context + this.solids = context.fetch(Solids) } } } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 90c72b9b..08497a57 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,7 +1,9 @@ package space.kscience.visionforge.meta import kotlinx.coroutines.* -import kotlinx.coroutines.flow.collectIndexed +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.toList import kotlinx.coroutines.test.runTest import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch @@ -106,24 +108,16 @@ internal class VisionPropertyTest { val child = group.children["child"]!! launch { - child.flowPropertyValue("test", inherit = true).collectIndexed { index, value -> - when (index) { - 0 -> assertEquals(22, value?.int) - 1 -> assertEquals(11, value?.int) - 2 -> { - assertEquals(33, value?.int) - cancel() - } - } - } + val list = child.flowPropertyValue("test", inherit = true).take(3).map { it?.int }.toList() + assertEquals(22, list.first()) + //assertEquals(11, list[1]) //a race + assertEquals(33, list.last()) } //wait for subscription to be created delay(5) child.properties.remove("test") - - delay(50) group.properties["test"] = 33 } } \ No newline at end of file -- 2.34.1 From ac651c4d502a6d831839a64f694ff02f9adca047 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 14:41:22 +0300 Subject: [PATCH 088/143] Fix reference property resolution --- .../kotlin/space/kscience/visionforge/solid/SolidReference.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 07398a42..0b1bc43e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -79,7 +79,7 @@ public class SolidReference( val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true //2. Resolve prototype onw properties - prototype.properties.getValue(name, inheritFlag, stylesFlag)?.let { return it } + prototype.properties.own?.getValue(name)?.let { return it } if (stylesFlag) { //3. own styles @@ -97,7 +97,7 @@ public class SolidReference( prototype.parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } } - return null + return descriptor?.defaultValue } -- 2.34.1 From e2f281debec9d7bafa46438fc02d38767f1c9e65 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 17:22:10 +0300 Subject: [PATCH 089/143] Optimizations... optimizations --- .../mipt/npm/root/serialization/jsonToRoot.kt | 1 - demo/muon-monitor/build.gradle.kts | 31 +++--- demo/solid-showcase/build.gradle.kts | 2 +- .../kscience/visionforge/solid/demo/demo.kt | 2 +- gradle.properties | 2 +- .../visionforge/bootstrap/outputConfig.kt | 3 + .../visionforge/react/valueChooser.kt | 3 +- .../kscience/visionforge/VisionChange.kt | 30 ++++-- .../kscience/visionforge/VisionContainer.kt | 23 +++-- .../space/kscience/visionforge/VisionGroup.kt | 2 +- .../kscience/visionforge/VisionManager.kt | 1 + .../space/kscience/visionforge/solid/Solid.kt | 2 +- .../visionforge/solid/SolidReference.kt | 2 +- .../solid/three/ThreeAmbientLightFactory.kt | 6 +- .../solid/three/ThreeCanvasLabelFactory.kt | 12 +-- .../solid/three/ThreeCompositeFactory.kt | 26 ++--- .../visionforge/solid/three/ThreeFactory.kt | 18 ++-- .../solid/three/ThreeLabelFactory.kt | 18 ++-- .../solid/three/ThreeLineFactory.kt | 20 ++-- .../visionforge/solid/three/ThreeMaterials.kt | 16 ++-- .../solid/three/ThreeMeshFactory.kt | 54 ++++++----- .../visionforge/solid/three/ThreePlugin.kt | 94 ++++++++++--------- .../solid/three/ThreePointLightFactory.kt | 20 ++-- .../solid/three/ThreeReferenceFactory.kt | 32 ++++--- .../build.gradle.kts | 35 ++++--- 25 files changed, 259 insertions(+), 196 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index b4a63748..96c6098c 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -91,7 +91,6 @@ private object RootDecoder { private fun KSerializer.unref(refCache: List): KSerializer = RootUnrefSerializer(this, refCache) - @OptIn(ExperimentalSerializationApi::class) fun unrefSerializersModule( refCache: List, ): SerializersModule = SerializersModule { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index b2c69a7d..fe3f89cb 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -21,21 +21,13 @@ kotlin { useCommonJs() browser { commonWebpackConfig { - cssSupport.enabled = false + cssSupport { + enabled = false + } } } } - afterEvaluate { - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(jsBrowserDistribution) - } - } - sourceSets { commonMain { dependencies { @@ -65,6 +57,23 @@ application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") } +val jsBrowserDistribution by tasks.getting +val jsBrowserDevelopmentExecutableDistribution by tasks.getting + +val devMode = rootProject.findProperty("visionforge.development") as? Boolean + ?: rootProject.version.toString().contains("dev") + +tasks.getByName("jvmProcessResources") { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + if (devMode) { + dependsOn(jsBrowserDevelopmentExecutableDistribution) + from(jsBrowserDevelopmentExecutableDistribution) + } else { + dependsOn(jsBrowserDistribution) + from(jsBrowserDistribution) + } +} + //distributions { // main { // contents { diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index d3e03135..2da1299f 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -40,5 +40,5 @@ kotlin { } application { - mainClassName = "space.kscience.visionforge.solid.demo.FXDemoAppKt" + mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") } \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 0398c6bf..ef009b82 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -20,7 +20,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro } val vision = solids.solidGroup { block() - ambientLight{ + ambientLight { color.set(Colors.white) } } diff --git a/gradle.properties b/gradle.properties index 668f0f5d..aeb2ca21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false -kotlin.incremental.js.ir=true +#kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index deb63381..3dfba202 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.bootstrap +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.css.BorderStyle import kotlinx.css.Color @@ -47,6 +48,7 @@ public external interface CanvasControlsProps : Props { public var vision: Vision? } + public val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { @@ -68,6 +70,7 @@ public val CanvasControls: FC = fc("CanvasControls") { prop } } } + @OptIn(DelicateCoroutinesApi::class) propertyEditor( scope = props.vision?.manager?.context ?: GlobalScope, properties = props.canvasOptions.meta, diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 7ba72e1c..04c7d946 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.react +import info.laht.threekt.math.Color import kotlinx.css.margin import kotlinx.css.pct import kotlinx.css.px @@ -149,7 +150,7 @@ public val ColorValueChooser: FC = fc("ColorValueChooser") { attrs { this.value = props.value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else value.string + else "#" + Color(value.string).getHexString() } ?: "#000000" onChangeFunction = handleChange } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index cfd522b3..1edcdf70 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import kotlin.jvm.Synchronized @@ -16,18 +17,37 @@ import kotlin.time.Duration * Create a deep copy of given Vision without external connections. */ private fun Vision.deepCopy(manager: VisionManager): Vision { + if(this is NullVision) return NullVision + //Assuming that unrooted visions are already isolated //TODO replace by efficient deep copy val json = manager.encodeToJsonElement(this) return manager.decodeFromJson(json) } +/** + * A vision used only in change propagation and showing that the target should be removed + */ +@Serializable +public object NullVision : Vision { + override var parent: Vision? + get() = null + set(_) { + error("Can't set parent for null vision") + } + + override val properties: MutableVisionProperties get() = error("Can't get properties of `NullVision`") + + override val descriptor: MetaDescriptor? = null + +} + + /** * An update for a [Vision] */ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVisionContainer { - private var reset: Boolean = false private var vision: Vision? = null private val propertyChange = MutableMeta() private val children: HashMap = HashMap() @@ -50,8 +70,7 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi override fun setChild(name: Name?, child: Vision?) { if (name == null) error("Static children are not allowed in VisionChange") getOrPutChild(name).apply { - vision = child - reset = vision == null + vision = child ?: NullVision } } @@ -59,7 +78,6 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi * Isolate collected changes by creating detached copies of given visions */ public fun deepCopy(): VisionChange = VisionChange( - reset, vision?.deepCopy(manager), if (propertyChange.isEmpty()) null else propertyChange.seal(), if (children.isEmpty()) null else children.mapValues { it.value.deepCopy() } @@ -67,14 +85,12 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi } /** - * @param delete flag showing that this vision child should be removed - * @param vision a new value for vision content + * @param vision a new value for vision content. If the Vision is to be removed should be [NullVision] * @param properties updated properties * @param children a map of children changed in ths [VisionChange]. If a child to be removed, set [delete] flag to true. */ @Serializable public data class VisionChange( - public val delete: Boolean = false, public val vision: Vision? = null, public val properties: Meta? = null, public val children: Map? = null, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index bda9ab42..975e170a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import space.kscience.dataforge.names.* +import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY import kotlin.jvm.Synchronized @DslMarker @@ -40,6 +41,8 @@ public interface VisionChildren : VisionContainer { } public companion object { + public const val STATIC_TOKEN_BODY: String = "@static" + public fun empty(owner: Vision): VisionChildren = object : VisionChildren { override val group: Vision get() = owner override val keys: Set get() = emptySet() @@ -105,8 +108,8 @@ public operator fun MutableVisionChildren.set(name: String?, vision: Vision?) { /** * Add a static child. Statics could not be found by name, removed or replaced. Changing statics also do not trigger events. */ -public fun MutableVisionChildren.static(child: Vision): Unit { - set(NameToken("@static", index = child.hashCode().toString()), child) +public fun MutableVisionChildren.static(child: Vision) { + set(NameToken(STATIC_TOKEN_BODY, index = child.hashCode().toString()), child) } public fun VisionChildren.asSequence(): Sequence> = sequence { @@ -185,14 +188,14 @@ internal abstract class VisionChildrenImpl( } override fun clear() { - if (!items.isNullOrEmpty()) { - updateJobs.values.forEach { - it.cancel() - } - updateJobs.clear() - items?.clear() - onChange(Name.EMPTY) - } + items?.forEach { set(it.key, null) } +// if (!items.isNullOrEmpty()) { +// updateJobs.values.forEach { +// it.cancel() +// } +// updateJobs.clear() +// items?.clear() +// } } } // diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 01786453..8a651ffc 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -35,7 +35,7 @@ public abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { - change.delete -> children.setChild(name, null) + change.vision == NullVision -> children.setChild(name, null) change.vision != null -> children.setChild(name, change.vision) else -> children.getChild(name)?.update(change) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 314b15d5..4e64f63a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -73,6 +73,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont private val defaultSerialModule: SerializersModule = SerializersModule { polymorphic(Vision::class) { default { SimpleVisionGroup.serializer() } + subclass(NullVision.serializer()) subclass(SimpleVisionGroup.serializer()) subclass(VisionOfNumberField.serializer()) subclass(VisionOfTextField.serializer()) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 2283f187..7d0d0b94 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -115,7 +115,7 @@ public interface Solid : Vision { public var Solid.layer: Int get() = properties.getValue(LAYER_KEY, inherit = true)?.int ?: 0 set(value) { - properties.set(LAYER_KEY, value) + properties[LAYER_KEY] = value } // Common properties diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 0b1bc43e..b54e3ab6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -186,7 +186,7 @@ internal class SolidReferenceChild( override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { - change.delete -> error("Deleting children inside ref is not allowed.") + change.vision == NullVision -> error("Deleting children inside ref is not allowed.") change.vision != null -> error("Updating content of the ref is not allowed") else -> children.getChild(name)?.update(change) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt index 9e105bde..5df6cc7a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -8,10 +8,10 @@ import kotlin.reflect.KClass public object ThreeAmbientLightFactory : ThreeFactory { override val type: KClass get() = AmbientLightSource::class - override fun build(three: ThreePlugin, obj: AmbientLightSource): AmbientLight { + override fun build(three: ThreePlugin, vision: AmbientLightSource, observe: Boolean): AmbientLight { val res = AmbientLight().apply { - color = obj.color.threeColor() ?: Color(0x404040) - intensity = obj.intensity.toDouble() + color = vision.color.threeColor() ?: Color(0x404040) + intensity = vision.intensity.toDouble() } return res diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 8b4e823b..cc798297 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -22,17 +22,17 @@ import kotlin.reflect.KClass public object ThreeCanvasLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun build(three: ThreePlugin, obj: SolidLabel): Object3D { + override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D - context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.properties.getValue(SolidMaterial.MATERIAL_COLOR_KEY, false, true)?.value ?: "black" + context.font = "Bold ${vision.fontSize}pt ${vision.fontFamily}" + context.fillStyle = vision.properties.getValue(SolidMaterial.MATERIAL_COLOR_KEY, false, true)?.value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE - val metrics = context.measureText(obj.text) + val metrics = context.measureText(vision.text) //canvas.width = metrics.width.toInt() - context.fillText(obj.text, (canvas.width - metrics.width) / 2, 0.5 * canvas.height) + context.fillText(vision.text, (canvas.width - metrics.width) / 2, 0.5 * canvas.height) // canvas contents will be used for a texture @@ -50,7 +50,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { material ) - mesh.updatePosition(obj) + mesh.updatePosition(vision) mesh.userData[DO_NOT_HIGHLIGHT_TAG] = true return mesh diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index de318f95..e4cb84d5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -37,21 +37,25 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class - override fun build(three: ThreePlugin, obj: Composite): Mesh { - val first = three.buildObject3D(obj.first).takeIfMesh() ?: error("First part of composite is not a mesh") - val second = three.buildObject3D(obj.second).takeIfMesh() ?: error("Second part of composite is not a mesh") - return when (obj.compositeType) { + override fun build(three: ThreePlugin, vision: Composite, observe: Boolean): Mesh { + val first = + three.buildObject3D(vision.first, observe).takeIfMesh() ?: error("First part of composite is not a mesh") + val second = + three.buildObject3D(vision.second, observe).takeIfMesh() ?: error("Second part of composite is not a mesh") + return when (vision.compositeType) { CompositeType.GROUP, CompositeType.UNION -> CSG.union(first, second) CompositeType.INTERSECT -> CSG.intersect(first, second) CompositeType.SUBTRACT -> CSG.subtract(first, second) }.apply { - updatePosition(obj) - applyProperties(obj) - obj.onPropertyChange { name -> - when { - //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) - name.startsWith(ThreeMeshFactory.EDGES_KEY) -> applyEdges(obj) - else -> updateProperty(obj, name) + updatePosition(vision) + applyProperties(vision) + if (observe) { + vision.onPropertyChange { name -> + when { + //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) + name.startsWith(ThreeMeshFactory.EDGES_KEY) -> applyEdges(vision) + else -> updateProperty(vision, name) + } } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 8c39aeb3..5c4c6cd5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -22,7 +22,11 @@ public interface ThreeFactory { public val type: KClass - public fun build(three: ThreePlugin, obj: T): Object3D + /** + * Build an [Object3D] from [vision]. + * @param observe if false, does not observe the changes in [vision] after render (useful for statics). + */ + public fun build(three: ThreePlugin, vision: T, observe: Boolean = true): Object3D public companion object { public const val TYPE: String = "threeFactory" @@ -32,10 +36,10 @@ public interface ThreeFactory { /** * Update position, rotation and visibility */ -public fun Object3D.updatePosition(obj: Vision) { - visible = obj.visible ?: true - if (obj is Solid) { - position.set(obj.x, obj.y, obj.z) +public fun Object3D.updatePosition(vision: Vision) { + visible = vision.visible ?: true + if (vision is Solid) { + position.set(vision.x, vision.y, vision.z) // val quaternion = obj.quaternion // @@ -46,9 +50,9 @@ public fun Object3D.updatePosition(obj: Vision) { // setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) // } - setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) + setRotationFromEuler( Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name)) - scale.set(obj.scaleX, obj.scaleY, obj.scaleZ) + scale.set(vision.scaleX, vision.scaleY, vision.scaleZ) updateMatrix() } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index b122f9c3..c9244ea5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -17,19 +17,21 @@ import kotlin.reflect.KClass public object ThreeLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun build(three: ThreePlugin, obj: SolidLabel): Object3D { - val textGeo = TextBufferGeometry(obj.text, jso { - font = obj.fontFamily + override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { + val textGeo = TextBufferGeometry(vision.text, jso { + font = vision.fontFamily size = 20 height = 1 curveSegments = 1 }) return Mesh(textGeo, ThreeMaterials.DEFAULT).apply { - updateMaterial(obj) - updatePosition(obj) - obj.onPropertyChange { - //TODO - three.logger.warn { "Label parameter change not implemented" } + createMaterial(vision) + updatePosition(vision) + if(observe) { + vision.onPropertyChange(three.context) { + //TODO + three.logger.warn { "Label parameter change not implemented" } + } } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index fcd92b7c..557a375f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -16,27 +16,29 @@ import kotlin.reflect.KClass public object ThreeLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override fun build(three: ThreePlugin, obj: PolyLine): Object3D { + override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { val geometry = BufferGeometry().apply { - setFromPoints(Array((obj.points.size - 1) * 2) { - obj.points[ceil(it / 2.0).toInt()].toVector() + setFromPoints(Array((vision.points.size - 1) * 2) { + vision.points[ceil(it / 2.0).toInt()].toVector() }) } val material = ThreeMaterials.getLineMaterial( - obj.properties.getProperty(SolidMaterial.MATERIAL_KEY), + vision.properties.getProperty(SolidMaterial.MATERIAL_KEY), false ) - material.linewidth = obj.thickness.toDouble() - material.color = obj.color.string?.let { Color(it) } ?: DEFAULT_LINE_COLOR + material.linewidth = vision.thickness.toDouble() + material.color = vision.color.string?.let { Color(it) } ?: DEFAULT_LINE_COLOR return LineSegments(geometry, material).apply { - updatePosition(obj) + updatePosition(vision) //layers.enable(obj.layer) //add listener to object properties - obj.onPropertyChange { propertyName -> - updateProperty(obj, propertyName) + if(observe) { + vision.onPropertyChange(three.context) { propertyName -> + updateProperty(vision, propertyName) + } } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 20bd7f3a..57e90750 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -49,7 +49,7 @@ public object ThreeMaterials { cached = true } - private val lineMaterialCache = HashMap() + private val lineMaterialCache = HashMap() private fun buildLineMaterial(meta: Meta): LineBasicMaterial = LineBasicMaterial().apply { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_LINE_COLOR @@ -61,14 +61,12 @@ public object ThreeMaterials { public fun getLineMaterial(meta: Meta?, cache: Boolean): LineBasicMaterial { if (meta == null) return DEFAULT_LINE return if (cache) { - lineMaterialCache.getOrPut(meta) { buildLineMaterial(meta) } + lineMaterialCache.getOrPut(meta.hashCode()) { buildLineMaterial(meta) } } else { buildLineMaterial(meta) } } - private val materialCache = HashMap() - internal fun buildMaterial(meta: Meta): Material = when (meta[SolidMaterial.TYPE_KEY]?.string) { "simple" -> MeshBasicMaterial().apply { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR @@ -85,7 +83,9 @@ public object ThreeMaterials { needsUpdate = true } - internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta) { + private val materialCache = HashMap() + + internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta.hashCode()) { buildMaterial(meta).apply { cached = true } @@ -130,11 +130,11 @@ private var Material.cached: Boolean userData["cached"] = value } -public fun Mesh.updateMaterial(vision: Vision) { +public fun Mesh.createMaterial(vision: Vision) { val ownMaterialMeta = vision.properties.own?.get(SolidMaterial.MATERIAL_KEY) if (ownMaterialMeta == null) { if (vision is SolidReference && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty()) { - updateMaterial(vision.prototype) + createMaterial(vision.prototype) } else { material = ThreeMaterials.cacheMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)) } @@ -150,7 +150,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { || propertyName == SolidMaterial.MATERIAL_KEY + SolidMaterial.TYPE_KEY ) { //generate a new material since cached material should not be changed - updateMaterial(vision) + createMaterial(vision) } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index a35ca12d..96fa2621 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -30,32 +30,34 @@ public abstract class ThreeMeshFactory( */ public abstract fun buildGeometry(obj: T): BufferGeometry - override fun build(three: ThreePlugin, obj: T): Mesh { - val geometry = buildGeometry(obj) + override fun build(three: ThreePlugin, vision: T, observe: Boolean): Mesh { + val geometry = buildGeometry(vision) //val meshMeta: Meta = obj.properties[Material3D.MATERIAL_KEY]?.node ?: Meta.empty val mesh = Mesh(geometry, ThreeMaterials.DEFAULT).apply { matrixAutoUpdate = false //set position for mesh - updatePosition(obj) - applyProperties(obj) + updatePosition(vision) + applyProperties(vision) } - //add listener to object properties - obj.onPropertyChange { name-> - when { - name.startsWith(Solid.GEOMETRY_KEY) -> { - val oldGeometry = mesh.geometry - val newGeometry = buildGeometry(obj) - oldGeometry.attributes = newGeometry.attributes - //mesh.applyWireFrame(obj) - mesh.applyEdges(obj) - newGeometry.dispose() + if(observe) { + //add listener to object properties + vision.onPropertyChange(three.context) { name -> + when { + name.startsWith(Solid.GEOMETRY_KEY) -> { + val oldGeometry = mesh.geometry + val newGeometry = buildGeometry(vision) + oldGeometry.attributes = newGeometry.attributes + //mesh.applyWireFrame(obj) + mesh.applyEdges(vision) + newGeometry.dispose() + } + //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) + name.startsWith(EDGES_KEY) -> mesh.applyEdges(vision) + else -> mesh.updateProperty(vision, name) } - //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) - name.startsWith(EDGES_KEY) -> mesh.applyEdges(obj) - else -> mesh.updateProperty(obj, name) } } @@ -76,26 +78,26 @@ public abstract class ThreeMeshFactory( @VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { - properties.set(EDGES_ENABLED_KEY, enabled) + properties[EDGES_ENABLED_KEY] = enabled SolidMaterial.write(properties.getProperty(EDGES_MATERIAL_KEY)).apply(block) } -internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { - updateMaterial(obj) - applyEdges(obj) +internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { + createMaterial(vision) + applyEdges(vision) //applyWireFrame(obj) - layers.set(obj.layer) + layers.set(vision.layer) children.forEach { - it.layers.set(obj.layer) + it.layers.set(vision.layer) } } -public fun Mesh.applyEdges(obj: Solid) { +public fun Mesh.applyEdges(vision: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.properties.getProperty(EDGES_ENABLED_KEY, inherit = true).boolean != false) { + if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return - val material = ThreeMaterials.getLineMaterial(obj.properties.getProperty(EDGES_MATERIAL_KEY), true) + val material = ThreeMaterials.getLineMaterial(vision.properties.getProperty(EDGES_MATERIAL_KEY), true) if (edges == null) { add( LineSegments( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index c715efdb..ba30e88b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -11,7 +11,7 @@ import space.kscience.dataforge.meta.update import space.kscience.dataforge.names.* import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision -import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.VisionChildren import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -48,69 +48,75 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { as ThreeFactory? } - public fun buildObject3D(obj: Solid): Object3D = when (obj) { - is ThreeJsVision -> obj.render(this) - is SolidReference -> ThreeReferenceFactory.build(this, obj) + public fun buildObject3D(vision: Solid, observe: Boolean = true): Object3D = when (vision) { + is ThreeJsVision -> vision.render(this) + is SolidReference -> ThreeReferenceFactory.build(this, vision, observe) is SolidGroup -> { val group = ThreeGroup() - obj.items.forEach { (token, child) -> + vision.items.forEach { (token, child) -> if (token != SolidGroup.PROTOTYPES_TOKEN && child.ignore != true) { try { - val object3D = buildObject3D(child) + val object3D = buildObject3D( + child, + if (token.body == VisionChildren.STATIC_TOKEN_BODY) false else observe + ) + // disable tracking changes for statics group[token] = object3D } catch (ex: Throwable) { logger.error(ex) { "Failed to render $child" } - ex.printStackTrace() } } } group.apply { - updatePosition(obj) + updatePosition(vision) //obj.onChildrenChange() - - obj.onPropertyChange(context) { name -> - if ( - name.startsWith(Solid.POSITION_KEY) || - name.startsWith(Solid.ROTATION_KEY) || - name.startsWith(Solid.SCALE_KEY) - ) { - //update position of mesh using this object - updatePosition(obj) - } else if (name == Vision.VISIBLE_KEY) { - visible = obj.visible ?: true - } - } - - obj.children.changes.onEach { childName -> - val child = obj.children.getChild(childName) - - //removing old object - findChild(childName)?.let { oldChild -> - oldChild.parent?.remove(oldChild) - } - - //adding new object - if (child != null && child is Solid) { - try { - val object3D = buildObject3D(child) - set(childName, object3D) - } catch (ex: Throwable) { - logger.error(ex) { "Failed to render $child" } + if (observe) { + vision.properties.changes.onEach { name -> + if ( + name.startsWith(Solid.POSITION_KEY) || + name.startsWith(Solid.ROTATION_KEY) || + name.startsWith(Solid.SCALE_KEY) + ) { + //update position of mesh using this object + updatePosition(vision) + } else if (name == Vision.VISIBLE_KEY) { + visible = vision.visible ?: true } - } - }.launchIn(context) + }.launchIn(context) + + vision.children.changes.onEach { childName -> + if(childName.isEmpty()) return@onEach + + val child = vision.children.getChild(childName) + + //removing old object + findChild(childName)?.let { oldChild -> + oldChild.parent?.remove(oldChild) + } + + //adding new object + if (child != null && child is Solid) { + try { + val object3D = buildObject3D(child) + set(childName, object3D) + } catch (ex: Throwable) { + logger.error(ex) { "Failed to render $child" } + } + } + }.launchIn(context) + } } } - is Composite -> compositeFactory.build(this, obj) + is Composite -> compositeFactory.build(this, vision, observe) else -> { //find specialized factory for this type if it is present - val factory: ThreeFactory? = findObjectFactory(obj::class) + val factory: ThreeFactory? = findObjectFactory(vision::class) when { - factory != null -> factory.build(this, obj) - obj is GeometrySolid -> ThreeShapeFactory.build(this, obj) - else -> error("Renderer for ${obj::class} not found") + factory != null -> factory.build(this, vision, observe) + vision is GeometrySolid -> ThreeShapeFactory.build(this, vision, observe) + else -> error("Renderer for ${vision::class} not found") } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt index e6c84c94..56df4b8b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -13,19 +13,21 @@ public object ThreePointLightFactory : ThreeFactory { private val DEFAULT_COLOR = Color(0x404040) - override fun build(three: ThreePlugin, obj: PointLightSource): PointLight { + override fun build(three: ThreePlugin, vision: PointLightSource, observe: Boolean): PointLight { val res = PointLight().apply { matrixAutoUpdate = false - color = obj.color.threeColor() ?: DEFAULT_COLOR - intensity = obj.intensity.toDouble() - updatePosition(obj) + color = vision.color.threeColor() ?: DEFAULT_COLOR + intensity = vision.intensity.toDouble() + updatePosition(vision) } - obj.onPropertyChange { name -> - when (name) { - LightSource::color.name.asName() -> res.color = obj.color.threeColor() ?: DEFAULT_COLOR - LightSource::intensity.name.asName() -> res.intensity = obj.intensity.toDouble() - else -> res.updateProperty(obj, name) + if(observe) { + vision.onPropertyChange(three.context) { name -> + when (name) { + LightSource::color.name.asName() -> res.color = vision.color.threeColor() ?: DEFAULT_COLOR + LightSource::intensity.name.asName() -> res.intensity = vision.intensity.toDouble() + else -> res.updateProperty(vision, name) + } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index ade11074..ec60ddb3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -31,33 +31,35 @@ public object ThreeReferenceFactory : ThreeFactory { } } - override fun build(three: ThreePlugin, obj: SolidReference): Object3D { - val template = obj.prototype + override fun build(three: ThreePlugin, vision: SolidReference, observe: Boolean): Object3D { + val template = vision.prototype val cachedObject = cache.getOrPut(template) { three.buildObject3D(template) } val object3D: Object3D = cachedObject.replicate() - object3D.updatePosition(obj) + object3D.updatePosition(vision) if (object3D is Mesh) { //object3D.material = ThreeMaterials.buildMaterial(obj.getProperty(SolidMaterial.MATERIAL_KEY).node!!) - object3D.applyProperties(obj) + object3D.applyProperties(vision) } //TODO apply child properties - obj.onPropertyChange { name -> - if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { - val childName = name.firstOrNull()?.index?.let(Name::parse) - ?: error("Wrong syntax for reference child property: '$name'") - val propertyName = name.cutFirst() - val referenceChild = - obj.children.getChild(childName) ?: error("Reference child with name '$childName' not found") - val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") - child.updateProperty(referenceChild, propertyName) - } else { - object3D.updateProperty(obj, name) + if (observe) { + vision.onPropertyChange(three.context) { name -> + if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { + val childName = name.firstOrNull()?.index?.let(Name::parse) + ?: error("Wrong syntax for reference child property: '$name'") + val propertyName = name.cutFirst() + val referenceChild = + vision.children.getChild(childName) ?: error("Reference child with name '$childName' not found") + val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") + child.updateProperty(referenceChild, propertyName) + } else { + object3D.updateProperty(vision, name) + } } } diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 399eb5b0..7623086d 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -1,11 +1,11 @@ plugins { id("space.kscience.gradle.mpp") - } +} val ktorVersion: String by rootProject.extra kotlin { - js(IR){ + js(IR) { browser { webpackTask { this.outputFileName = "js/visionforge-three.js" @@ -14,17 +14,6 @@ kotlin { binaries.executable() } - afterEvaluate { - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - afterEvaluate { - from(jsBrowserDistribution) - } - } - } - sourceSets { commonMain { dependencies { @@ -42,4 +31,22 @@ kotlin { } } } -} \ No newline at end of file +} + + +val jsBrowserDistribution by tasks.getting +val jsBrowserDevelopmentExecutableDistribution by tasks.getting + +val devMode = rootProject.findProperty("visionforge.development") as? Boolean + ?: rootProject.version.toString().contains("dev") + +tasks.getByName("jvmProcessResources") { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + if (devMode) { + dependsOn(jsBrowserDevelopmentExecutableDistribution) + from(jsBrowserDevelopmentExecutableDistribution) + } else { + dependsOn(jsBrowserDistribution) + from(jsBrowserDistribution) + } +} -- 2.34.1 From 98bb935de5f7ebf5e2a4cc4d9986f38293275994 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 20:28:47 +0300 Subject: [PATCH 090/143] Optimizations... optimizations --- visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 16 +++++++++------- .../visionforge/solid/three/ThreeFactory.kt | 5 ++--- .../visionforge/solid/three/ThreeMaterials.kt | 4 ++-- .../visionforge/solid/three/ThreeMeshFactory.kt | 6 ++++-- .../solid/three/ThreeReferenceFactory.kt | 7 +++---- .../kscience/visionforge/solid/three/three.kt | 9 +++++++++ 7 files changed, 30 insertions(+), 19 deletions(-) diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 86b8702c..8be1b7a1 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -10,6 +10,6 @@ kotlin{ dependencies { api(project(":visionforge-solid")) - implementation(npm("three", "0.137.5")) + implementation(npm("three", "0.143.0")) implementation(npm("three-csg-ts", "3.1.10")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 586abe32..747b722a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -212,7 +212,7 @@ public class ThreeCanvas( } //find first non-static parent in this object ancestry - private fun Object3D?.upTrace(): Object3D? = if (this?.name?.startsWith("@") == true) parent else this + private tailrec fun Object3D.upTrace(): Object3D? = if (!name.startsWith("@")) this else parent?.upTrace() private fun pick(): Object3D? { // update the picking ray with the camera and mouse position @@ -222,8 +222,8 @@ public class ThreeCanvas( return root?.let { root -> val intersects = raycaster.intersectObject(root, true) //skip invisible objects - val obj = intersects.map { it.`object` }.firstOrNull { it.visible } - obj.upTrace() + val obj: Object3D? = intersects.map { it.`object` }.firstOrNull { it.visible } + obj?.upTrace() } } @@ -280,20 +280,22 @@ public class ThreeCanvas( edgesName: String, material: LineBasicMaterial = SELECTED_MATERIAL, ) { + if (userData[DO_NOT_HIGHLIGHT_TAG] == true) { return } - if (this is Mesh) { - val edges = getObjectByName(edgesName) ?: LineSegments( + + if (isMesh(this)) { + val highlightMesh = getObjectByName(edgesName) ?: LineSegments( EdgesGeometry(geometry), material ).also { it.name = edgesName add(it) } - edges.visible = highlight + highlightMesh.visible = highlight } else { - children.filter { it.name != edgesName }.forEach { + children.filter { !it.name.startsWith("@") && it.name != edgesName }.forEach { it.toggleHighlight(highlight, edgesName, material) } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 5c4c6cd5..0f38640c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Euler -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith @@ -50,7 +49,7 @@ public fun Object3D.updatePosition(vision: Vision) { // setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) // } - setRotationFromEuler( Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name)) + setRotationFromEuler(Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name)) scale.set(vision.scaleX, vision.scaleY, vision.scaleZ) updateMatrix() @@ -62,7 +61,7 @@ public fun Object3D.updatePosition(vision: Vision) { */ public fun Object3D.updateProperty(source: Vision, propertyName: Name) { // console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}") - if (this is Mesh && propertyName.startsWith(MATERIAL_KEY)) { + if (isMesh(this) && propertyName.startsWith(MATERIAL_KEY)) { updateMaterialProperty(source, propertyName) } else if ( propertyName.startsWith(Solid.POSITION_KEY) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 57e90750..3826f11d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -39,13 +39,13 @@ public object ThreeMaterials { public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { color.set(Colors.ivory) - linewidth = 8.0 + linewidth = 2.0 cached = true } public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { color.set(Colors.blue) - linewidth = 8.0 + linewidth = 2.0 cached = true } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index 96fa2621..1a68985f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -17,6 +17,7 @@ import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY +import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_OBJECT_NAME import kotlin.reflect.KClass /** @@ -66,6 +67,7 @@ public abstract class ThreeMeshFactory( public companion object { public val EDGES_KEY: Name = "edges".asName() + internal const val EDGES_OBJECT_NAME: String = "@edges" //public val WIREFRAME_KEY: Name = "wireframe".asName() public val ENABLED_KEY: Name = "enabled".asName() @@ -93,7 +95,7 @@ internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { } public fun Mesh.applyEdges(vision: Solid) { - val edges = children.find { it.name == "@edges" } as? LineSegments + val edges = children.find { it.name == EDGES_OBJECT_NAME } as? LineSegments //inherited edges definition, enabled by default if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return @@ -104,7 +106,7 @@ public fun Mesh.applyEdges(vision: Solid) { EdgesGeometry(bufferGeometry), material ).apply { - name = "@edges" + name = EDGES_OBJECT_NAME } ) } else { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index ec60ddb3..b0e1d69c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -17,11 +17,10 @@ public object ThreeReferenceFactory : ThreeFactory { override val type: KClass = SolidReference::class private fun Object3D.replicate(): Object3D { - return when (this) { - is Mesh -> Mesh(geometry, material).also { + return when { + isMesh(this) -> Mesh(geometry, material).also { it.applyMatrix4(matrix) } - else -> clone(false) }.also { obj: Object3D -> obj.name = this.name @@ -40,7 +39,7 @@ public object ThreeReferenceFactory : ThreeFactory { val object3D: Object3D = cachedObject.replicate() object3D.updatePosition(vision) - if (object3D is Mesh) { + if (isMesh(object3D)) { //object3D.material = ThreeMaterials.buildMaterial(obj.getProperty(SolidMaterial.MATERIAL_KEY).node!!) object3D.applyProperties(vision) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index d21ff544..94262052 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -11,6 +11,7 @@ import info.laht.threekt.textures.Texture import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get +import kotlin.contracts.contract import kotlin.math.PI public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f) @@ -34,6 +35,14 @@ internal fun Any.dispose() { public fun Layers.check(layer: Int): Boolean = (mask shr (layer) and 0x00000001) > 0 + +internal fun isMesh(object3D: Object3D): Boolean{ + contract { + returns(true) implies (object3D is Mesh) + } + return object3D.asDynamic().isMesh as? Boolean ?: false +} + internal fun Object3D.takeIfMesh(): Mesh? { val d = asDynamic() return if(d.isMesh as Boolean){ -- 2.34.1 From cb25dca34c42cac5afbdada60be6f046d33d978f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 Aug 2022 22:03:46 +0300 Subject: [PATCH 091/143] Refactor three package. Add MeshLine --- CHANGELOG.md | 9 +++- .../visionforge/solid/demo/VariableBox.kt | 6 +-- .../visionforge/react/valueChooser.kt | 2 +- .../kscience/visionforge/solid/PolyLine.kt | 6 ++- visionforge-threejs/build.gradle.kts | 1 + .../info/laht/threekt/extras/core/Shape.kt | 8 ---- .../laht/threekt/extras/core/ShapePath.kt | 6 --- .../laht/threekt/geometries/EdgesGeometry.kt | 8 ---- .../main/kotlin/info/laht/threekt/ktutils.kt | 9 ---- .../solid/three/ThreeAmbientLightFactory.kt | 4 +- .../solid/three/ThreeBoxFactory.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 47 ++++++++++++------- .../solid/three/ThreeCanvasLabelFactory.kt | 12 ++--- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../solid/three/ThreeConeFactory.kt | 4 +- .../solid/three/ThreeConvexFactory.kt | 2 +- .../visionforge/solid/three/ThreeFactory.kt | 6 +-- .../solid/three/ThreeGeometryBuilder.kt | 6 +-- .../visionforge/solid/three/ThreeJsVision.kt | 2 +- .../solid/three/ThreeLabelFactory.kt | 6 +-- .../solid/three/ThreeLineFactory.kt | 8 ++-- .../visionforge/solid/three/ThreeMaterials.kt | 26 +++------- .../solid/three/ThreeMeshFactory.kt | 8 ++-- .../solid/three/ThreeMeshLineFactory.kt | 41 ++++++++++++++++ .../visionforge/solid/three/ThreePlugin.kt | 8 ++-- .../solid/three/ThreePointLightFactory.kt | 4 +- .../solid/three/ThreeReferenceFactory.kt | 4 +- .../solid/three/ThreeSmartLineFactory.kt | 17 +++++++ .../solid/three/ThreeSphereFactory.kt | 4 +- .../kscience/visionforge/solid/three/csg.kt | 8 ++-- .../kscience/visionforge/solid/three/three.kt | 16 +++---- .../{info/laht/threekt => three}/THREE.kt | 2 +- .../animation/AnimationAction.kt | 4 +- .../animation/AnimationClip.kt | 2 +- .../animation/AnimationMixer.kt | 4 +- .../animation/AnimationUtils.kt | 2 +- .../animation/KeyFrameTrack.kt | 2 +- .../laht/threekt => three}/audio/Audio.kt | 2 +- .../threekt => three}/audio/AudioContext.kt | 2 +- .../threekt => three}/audio/AudioListener.kt | 4 +- .../audio/PositionalAudio.kt | 2 +- .../laht/threekt => three}/cameras/Camera.kt | 8 ++-- .../cameras/OrthographicCamera.kt | 2 +- .../cameras/PerspectiveCamera.kt | 2 +- .../threekt => three}/core/BufferAttribute.kt | 10 ++-- .../threekt => three}/core/BufferGeometry.kt | 10 ++-- .../laht/threekt => three}/core/Clock.kt | 2 +- .../threekt => three}/core/EventDispatcher.kt | 2 +- .../laht/threekt => three}/core/Face3.kt | 6 +-- .../core/InstancedBufferGeometry.kt | 2 +- .../laht/threekt => three}/core/Layers.kt | 2 +- .../laht/threekt => three}/core/Object3D.kt | 4 +- .../laht/threekt => three}/core/Raycaster.kt | 10 ++-- .../laht/threekt => three}/core/Uniform.kt | 2 +- .../threekt => three}/external/Detector.kt | 2 +- .../external/ImprovedNoise.kt | 2 +- .../external/SimplexNoise.kt | 2 +- .../external/controls/FlyControls.kt | 4 +- .../external/controls/OrbitControls.kt | 6 +-- .../external/controls/TrackballControls.kt | 8 ++-- .../external/controls/TransformControls.kt | 4 +- .../external/exporters/OBJExporter.kt | 4 +- .../external/exporters/STLExporter.kt | 4 +- .../external/geometries/ConvexGeometry.kt | 6 +-- .../external/libs/GUIParams.kt | 2 +- .../threekt => three}/external/libs/Stats.kt | 2 +- .../threekt => three}/external/libs/datgui.kt | 2 +- .../external/loaders/BabylonLoader.kt | 6 +-- .../external/loaders/GLTFLoader.kt | 10 ++-- .../external/loaders/LoaderSupport.kt | 2 +- .../external/loaders/MTLLoader.kt | 6 +-- .../external/loaders/OBJLoader.kt | 8 ++-- .../external/loaders/OBJLoader2.kt | 6 +-- .../external/loaders/STLLoader.kt | 6 +-- .../threekt => three}/external/objects/Sky.kt | 4 +- .../external/objects/Water.kt | 4 +- .../external/objects/WaterOptions.kt | 6 +-- .../threekt => three}/extras/SceneUtils.kt | 12 ++--- .../threekt => three}/extras/core/Curve.kt | 2 +- .../extras/core/CurvePath.kt | 2 +- .../threekt => three}/extras/core/Path.kt | 4 +- .../main/kotlin/three/extras/core/Shape.kt | 8 ++++ .../kotlin/three/extras/core/ShapePath.kt | 6 +++ .../extras/curves/ArcCurve.kt | 2 +- .../extras/curves/CatmullRomCurve3.kt | 6 +-- .../extras/curves/EllipseCurve.kt | 6 +-- .../extras/curves/LineCurve.kt | 6 +-- .../extras/curves/LineCurve3.kt | 6 +-- .../extras/curves/QuadricBezierCurve.kt | 6 +-- .../extras/curves/QuadricBezierCurve3.kt | 6 +-- .../extras/curves/SplineCurve.kt | 6 +-- .../geometries/BoxGeometry.kt | 4 +- .../geometries/ConeGeometry.kt | 4 +- .../geometries/CylinderGeometry.kt | 4 +- .../kotlin/three/geometries/EdgesGeometry.kt | 8 ++++ .../geometries/ExtrudeGeometry.kt | 8 ++-- .../geometries/PlaneGeometry.kt | 4 +- .../geometries/SphereGeometry.kt | 4 +- .../geometries/TextGeometry.kt | 2 +- .../geometries/TorusGeometry.kt | 4 +- .../geometries/TubeGeometry.kt | 8 ++-- .../geometries/WireframeGeometry.kt | 4 +- .../threekt => three}/helpers/ArrowHelper.kt | 12 ++--- .../threekt => three}/helpers/AxesHelper.kt | 4 +- .../threekt => three}/helpers/Box3Helper.kt | 6 +-- .../threekt => three}/helpers/CameraHelper.kt | 6 +-- .../threekt => three}/helpers/GridHelper.kt | 4 +- .../helpers/HemisphereLightHelper.kt | 8 ++-- .../threekt => three}/helpers/PlaneHelper.kt | 8 ++-- .../src/main/kotlin/three/ktutils.kt | 9 ++++ .../threekt => three}/lights/AmbientLight.kt | 2 +- .../lights/DirectionalLight.kt | 4 +- .../lights/DirectionalLightShadow.kt | 2 +- .../lights/HemisphereLight.kt | 4 +- .../laht/threekt => three}/lights/Light.kt | 6 +-- .../threekt => three}/lights/LightShadow.kt | 8 ++-- .../threekt => three}/lights/PointLight.kt | 2 +- .../threekt => three}/lights/SpotLight.kt | 4 +- .../lights/SpotLightShadow.kt | 2 +- .../laht/threekt => three}/loaders/Cache.kt | 2 +- .../loaders/CompressedTextureLoader.kt | 4 +- .../threekt => three}/loaders/ImageLoader.kt | 2 +- .../threekt => three}/loaders/JSONLoader.kt | 8 ++-- .../laht/threekt => three}/loaders/Loader.kt | 2 +- .../loaders/LoadingManager.kt | 2 +- .../loaders/MaterialLoader.kt | 6 +-- .../loaders/TextureLoader.kt | 4 +- .../materials/LineBasicMaterial.kt | 4 +- .../materials/LineDashedMaterial.kt | 2 +- .../threekt => three}/materials/Material.kt | 2 +- .../materials/MeshBasicMaterial.kt | 6 +-- .../materials/MeshDepthMaterial.kt | 4 +- .../materials/MeshLambertMaterial.kt | 6 +-- .../materials/MeshNormalMaterial.kt | 6 +-- .../materials/MeshPhongMaterial.kt | 8 ++-- .../materials/MeshPhysicalMaterial.kt | 2 +- .../materials/MeshStandardMaterial.kt | 8 ++-- .../materials/PointsMaterial.kt | 6 +-- .../materials/RawShaderMaterial.kt | 2 +- .../materials/ShaderMaterial.kt | 2 +- .../materials/SpriteMaterial.kt | 6 +-- .../{info/laht/threekt => three}/math/Box2.kt | 2 +- .../{info/laht/threekt => three}/math/Box3.kt | 4 +- .../laht/threekt => three}/math/Color.kt | 2 +- .../threekt => three}/math/ColorConstants.kt | 2 +- .../threekt => three}/math/Cylindrical.kt | 2 +- .../laht/threekt => three}/math/Euler.kt | 2 +- .../laht/threekt => three}/math/Frustrum.kt | 2 +- .../laht/threekt => three}/math/Line3.kt | 2 +- .../{info/laht/threekt => three}/math/Math.kt | 2 +- .../laht/threekt => three}/math/Matrix3.kt | 4 +- .../laht/threekt => three}/math/Matrix4.kt | 4 +- .../laht/threekt => three}/math/Plane.kt | 2 +- .../laht/threekt => three}/math/Quaternion.kt | 2 +- .../{info/laht/threekt => three}/math/Ray.kt | 2 +- .../laht/threekt => three}/math/Sphere.kt | 2 +- .../laht/threekt => three}/math/Spherical.kt | 2 +- .../laht/threekt => three}/math/Triangle.kt | 2 +- .../laht/threekt => three}/math/Vector2.kt | 2 +- .../laht/threekt => three}/math/Vector3.kt | 4 +- .../laht/threekt => three}/math/Vector4.kt | 2 +- .../laht/threekt => three}/math/operators.kt | 2 +- .../main/kotlin/three/meshline/MeshLine.kt | 37 +++++++++++++++ .../main/kotlin/three/meshline/meshLineExt.kt | 8 ++++ .../laht/threekt => three}/objects/Group.kt | 4 +- .../laht/threekt => three}/objects/LOD.kt | 10 ++-- .../laht/threekt => three}/objects/Line.kt | 12 ++--- .../threekt => three}/objects/LineLoop.kt | 6 +-- .../threekt => three}/objects/LineSegments.kt | 8 ++-- .../laht/threekt => three}/objects/Mesh.kt | 12 ++--- .../laht/threekt => three}/objects/Points.kt | 10 ++-- .../laht/threekt => three}/objects/Sprite.kt | 10 ++-- .../renderers/WebGL2Renderer.kt | 6 +-- .../renderers/WebGL2RendererParams.kt | 2 +- .../renderers/WebGLRenderTarget.kt | 6 +-- .../renderers/WebGLRenderTargetOptions.kt | 2 +- .../renderers/WebGLRenderer.kt | 8 ++-- .../renderers/WebGLRendererParams.kt | 2 +- .../renderers/shaders/ShaderChunk.kt | 2 +- .../renderers/shaders/ShaderLib.kt | 2 +- .../renderers/shaders/UniformsUtil.kt | 4 +- .../laht/threekt => three}/scenes/Fog.kt | 4 +- .../laht/threekt => three}/scenes/FogExp2.kt | 4 +- .../laht/threekt => three}/scenes/Scene.kt | 6 +-- .../textures/CompressedTexture.kt | 2 +- .../threekt => three}/textures/CubeTexture.kt | 2 +- .../textures/DepthTexture.kt | 2 +- .../threekt => three}/textures/Texture.kt | 6 +-- .../utils/BufferGeometryUtils.kt | 4 +- 189 files changed, 573 insertions(+), 461 deletions(-) delete mode 100644 visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Shape.kt delete mode 100644 visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/ShapePath.kt delete mode 100644 visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/EdgesGeometry.kt delete mode 100644 visionforge-threejs/src/main/kotlin/info/laht/threekt/ktutils.kt create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/THREE.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/animation/AnimationAction.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/animation/AnimationClip.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/animation/AnimationMixer.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/animation/AnimationUtils.kt (70%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/animation/KeyFrameTrack.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/audio/Audio.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/audio/AudioContext.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/audio/AudioListener.kt (89%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/audio/PositionalAudio.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/cameras/Camera.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/cameras/OrthographicCamera.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/cameras/PerspectiveCamera.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/BufferAttribute.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/BufferGeometry.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Clock.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/EventDispatcher.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Face3.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/InstancedBufferGeometry.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Layers.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Object3D.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Raycaster.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/core/Uniform.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/Detector.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/ImprovedNoise.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/SimplexNoise.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/controls/FlyControls.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/controls/OrbitControls.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/controls/TrackballControls.kt (90%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/controls/TransformControls.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/exporters/OBJExporter.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/exporters/STLExporter.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/geometries/ConvexGeometry.kt (61%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/libs/GUIParams.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/libs/Stats.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/libs/datgui.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/BabylonLoader.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/GLTFLoader.kt (89%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/LoaderSupport.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/MTLLoader.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/OBJLoader.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/OBJLoader2.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/loaders/STLLoader.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/objects/Sky.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/objects/Water.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/external/objects/WaterOptions.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/SceneUtils.kt (87%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/core/Curve.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/core/CurvePath.kt (89%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/core/Path.kt (61%) create mode 100644 visionforge-threejs/src/main/kotlin/three/extras/core/Shape.kt create mode 100644 visionforge-threejs/src/main/kotlin/three/extras/core/ShapePath.kt rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/ArcCurve.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/CatmullRomCurve3.kt (79%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/EllipseCurve.kt (85%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/LineCurve.kt (66%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/LineCurve3.kt (67%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/QuadricBezierCurve.kt (74%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/QuadricBezierCurve3.kt (74%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/extras/curves/SplineCurve.kt (67%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/BoxGeometry.kt (77%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/ConeGeometry.kt (79%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/CylinderGeometry.kt (78%) create mode 100644 visionforge-threejs/src/main/kotlin/three/geometries/EdgesGeometry.kt rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/ExtrudeGeometry.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/PlaneGeometry.kt (67%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/SphereGeometry.kt (78%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/TextGeometry.kt (96%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/TorusGeometry.kt (73%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/TubeGeometry.kt (72%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/geometries/WireframeGeometry.kt (68%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/ArrowHelper.kt (87%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/AxesHelper.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/Box3Helper.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/CameraHelper.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/GridHelper.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/HemisphereLightHelper.kt (91%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/helpers/PlaneHelper.kt (58%) create mode 100644 visionforge-threejs/src/main/kotlin/three/ktutils.kt rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/AmbientLight.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/DirectionalLight.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/DirectionalLightShadow.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/HemisphereLight.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/Light.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/LightShadow.kt (90%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/PointLight.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/SpotLight.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/lights/SpotLightShadow.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/Cache.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/CompressedTextureLoader.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/ImageLoader.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/JSONLoader.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/Loader.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/LoadingManager.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/MaterialLoader.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/loaders/TextureLoader.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/LineBasicMaterial.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/LineDashedMaterial.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/Material.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshBasicMaterial.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshDepthMaterial.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshLambertMaterial.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshNormalMaterial.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshPhongMaterial.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshPhysicalMaterial.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/MeshStandardMaterial.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/PointsMaterial.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/RawShaderMaterial.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/ShaderMaterial.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/materials/SpriteMaterial.kt (92%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Box2.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Box3.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Color.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/ColorConstants.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Cylindrical.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Euler.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Frustrum.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Line3.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Math.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Matrix3.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Matrix4.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Plane.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Quaternion.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Ray.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Sphere.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Spherical.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Triangle.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Vector2.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Vector3.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/Vector4.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/math/operators.kt (98%) create mode 100644 visionforge-threejs/src/main/kotlin/three/meshline/MeshLine.kt create mode 100644 visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/Group.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/LOD.kt (88%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/Line.kt (85%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/LineLoop.kt (90%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/LineSegments.kt (89%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/Mesh.kt (86%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/Points.kt (87%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/objects/Sprite.kt (87%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGL2Renderer.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGL2RendererParams.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGLRenderTarget.kt (93%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGLRenderTargetOptions.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGLRenderer.kt (96%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/WebGLRendererParams.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/shaders/ShaderChunk.kt (99%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/shaders/ShaderLib.kt (96%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/renderers/shaders/UniformsUtil.kt (94%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/scenes/Fog.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/scenes/FogExp2.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/scenes/Scene.kt (95%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/textures/CompressedTexture.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/textures/CubeTexture.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/textures/DepthTexture.kt (97%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/textures/Texture.kt (98%) rename visionforge-threejs/src/main/kotlin/{info/laht/threekt => three}/utils/BufferGeometryUtils.kt (87%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a59c31d9..f60db403 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,15 @@ ## [Unreleased] ### Added - Context receivers flag +- MeshLine for thick lines ### Changed -- Naming of Canvas3D options -- Lights are added to the scene instead of 3D options +- Visions **must** be rooted in order to subscribe to updates. +- Visions use flows instead of direct subscriptions. +- Radical change of inner workings of vision children and properties. +- Three package changed to `three`. +- Naming of Canvas3D options. +- Lights are added to the scene instead of 3D options. ### Deprecated diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 28b0c968..1e626155 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -1,8 +1,5 @@ package space.kscience.visionforge.solid.demo -import info.laht.threekt.core.Object3D -import info.laht.threekt.geometries.BoxGeometry -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.number @@ -13,6 +10,9 @@ import space.kscience.visionforge.setChild import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.* +import three.core.Object3D +import three.geometries.BoxGeometry +import three.objects.Mesh import kotlin.math.max internal fun SolidGroup.varBox( diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 04c7d946..96c1e6fe 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.react -import info.laht.threekt.math.Color import kotlinx.css.margin import kotlinx.css.pct import kotlinx.css.px @@ -25,6 +24,7 @@ import space.kscience.visionforge.widgetType import styled.css import styled.styledInput import styled.styledSelect +import three.math.Color public external interface ValueChooserProps : Props { public var descriptor: MetaDescriptor? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index 4d5373b8..0f366dbe 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -10,7 +10,11 @@ import space.kscience.visionforge.* public class PolyLine(public val points: List) : SolidBase() { //var lineType by string() - public var thickness: Number by properties.getProperty(SolidMaterial.MATERIAL_KEY).number { 1.0 } + public var thickness: Number by properties.root(inherit = false, includeStyles = true).number { DEFAULT_THICKNESS } + + public companion object { + public const val DEFAULT_THICKNESS: Double = 1.0 + } } @VisionBuilder diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 8be1b7a1..7ba2c555 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -12,4 +12,5 @@ dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.143.0")) implementation(npm("three-csg-ts", "3.1.10")) + implementation(npm("three.meshline","1.4.0")) } diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Shape.kt b/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Shape.kt deleted file mode 100644 index 0b584f1f..00000000 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Shape.kt +++ /dev/null @@ -1,8 +0,0 @@ -@file:JsModule("three") -@file:JsNonModule - -package info.laht.threekt.extras.core - -import info.laht.threekt.math.Vector2 - -external class Shape(points: Array) : Path \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/ShapePath.kt b/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/ShapePath.kt deleted file mode 100644 index bd6e69b9..00000000 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/ShapePath.kt +++ /dev/null @@ -1,6 +0,0 @@ -@file:JsModule("three") -@file:JsNonModule - -package info.laht.threekt.extras.core - -external class ShapePath \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/EdgesGeometry.kt b/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/EdgesGeometry.kt deleted file mode 100644 index b0a5c91b..00000000 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/EdgesGeometry.kt +++ /dev/null @@ -1,8 +0,0 @@ -@file:JsModule("three") -@file:JsNonModule - -package info.laht.threekt.geometries - -import info.laht.threekt.core.BufferGeometry - -public external class EdgesGeometry(geometry: BufferGeometry, thresholdAngle: Int = definedExternally) : BufferGeometry \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/ktutils.kt b/visionforge-threejs/src/main/kotlin/info/laht/threekt/ktutils.kt deleted file mode 100644 index a0ef343e..00000000 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/ktutils.kt +++ /dev/null @@ -1,9 +0,0 @@ -@file:Suppress("FunctionName") - -package info.laht.threekt - -import info.laht.threekt.renderers.WebGLRenderer -import info.laht.threekt.renderers.WebGLRendererParams - -fun WebGLRenderer(builder: WebGLRendererParams.() -> Unit): WebGLRenderer = - WebGLRenderer(WebGLRendererParams().apply(builder)) \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt index 5df6cc7a..3d420570 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.lights.AmbientLight -import info.laht.threekt.math.Color import space.kscience.visionforge.solid.AmbientLightSource +import three.lights.AmbientLight +import three.math.Color import kotlin.reflect.KClass public object ThreeAmbientLightFactory : ThreeFactory { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt index f66492ed..21c52198 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.geometries.BoxGeometry import space.kscience.visionforge.solid.Box import space.kscience.visionforge.solid.detail +import three.geometries.BoxGeometry public object ThreeBoxFactory : ThreeMeshFactory(Box::class) { override fun buildGeometry(obj: Box): BoxGeometry = diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 747b722a..04b04699 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -1,18 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.WebGLRenderer -import info.laht.threekt.cameras.PerspectiveCamera -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster -import info.laht.threekt.external.controls.OrbitControls -import info.laht.threekt.external.controls.TrackballControls -import info.laht.threekt.geometries.EdgesGeometry -import info.laht.threekt.helpers.AxesHelper -import info.laht.threekt.materials.LineBasicMaterial -import info.laht.threekt.math.* -import info.laht.threekt.objects.LineSegments -import info.laht.threekt.objects.Mesh -import info.laht.threekt.scenes.Scene import kotlinx.browser.window import org.w3c.dom.Element import org.w3c.dom.HTMLCanvasElement @@ -25,8 +12,19 @@ import space.kscience.dataforge.names.* import space.kscience.visionforge.Colors import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.specifications.* -import space.kscience.visionforge.solid.three.ThreeMaterials.HIGHLIGHT_MATERIAL -import space.kscience.visionforge.solid.three.ThreeMaterials.SELECTED_MATERIAL +import three.WebGLRenderer +import three.cameras.PerspectiveCamera +import three.core.Object3D +import three.core.Raycaster +import three.external.controls.OrbitControls +import three.external.controls.TrackballControls +import three.geometries.EdgesGeometry +import three.helpers.AxesHelper +import three.math.* +import three.meshline.MeshLine +import three.meshline.MeshLineMaterial +import three.objects.Mesh +import three.scenes.Scene import kotlin.math.cos import kotlin.math.sin @@ -278,7 +276,7 @@ public class ThreeCanvas( private fun Object3D.toggleHighlight( highlight: Boolean, edgesName: String, - material: LineBasicMaterial = SELECTED_MATERIAL, + material: MeshLineMaterial, ) { if (userData[DO_NOT_HIGHLIGHT_TAG] == true) { @@ -286,8 +284,8 @@ public class ThreeCanvas( } if (isMesh(this)) { - val highlightMesh = getObjectByName(edgesName) ?: LineSegments( - EdgesGeometry(geometry), + val highlightMesh = getObjectByName(edgesName) ?: Mesh( + MeshLine(EdgesGeometry(geometry)), material ).also { it.name = edgesName @@ -319,6 +317,19 @@ public class ThreeCanvas( } public companion object { + public val SELECTED_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { + color.set(Colors.ivory) + linewidth = 2.0 + cached = true + } + + public val HIGHLIGHT_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { + color.set(Colors.blue) + linewidth = 2.0 + cached = true + } + + public const val DO_NOT_HIGHLIGHT_TAG: String = "doNotHighlight" private const val HIGHLIGHT_NAME = "@highlight" private const val SELECT_NAME = "@select" diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index cc798297..0b0019df 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -1,11 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.DoubleSide -import info.laht.threekt.core.Object3D -import info.laht.threekt.geometries.PlaneGeometry -import info.laht.threekt.materials.MeshBasicMaterial -import info.laht.threekt.objects.Mesh -import info.laht.threekt.textures.Texture import kotlinx.browser.document import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.CanvasTextBaseline @@ -14,6 +8,12 @@ import org.w3c.dom.MIDDLE import space.kscience.visionforge.solid.SolidLabel import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG +import three.DoubleSide +import three.core.Object3D +import three.geometries.PlaneGeometry +import three.materials.MeshBasicMaterial +import three.objects.Mesh +import three.textures.Texture import kotlin.reflect.KClass /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index e4cb84d5..44bcb797 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -1,11 +1,11 @@ package space.kscience.visionforge.solid.three import CSG -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Composite import space.kscience.visionforge.solid.CompositeType +import three.objects.Mesh import kotlin.reflect.KClass /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt index 8eed04ae..acb81e1f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.geometries.CylinderGeometry import space.kscience.visionforge.solid.ConeSegment import space.kscience.visionforge.solid.detail +import three.core.BufferGeometry +import three.geometries.CylinderGeometry import kotlin.math.PI import kotlin.math.pow diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt index 2ab67219..83115b13 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.external.geometries.ConvexBufferGeometry import space.kscience.visionforge.solid.Convex +import three.external.geometries.ConvexBufferGeometry public object ThreeConvexFactory : ThreeMeshFactory(Convex::class) { override fun buildGeometry(obj: Convex): ConvexBufferGeometry { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 0f38640c..cf42c139 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -1,8 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Euler import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith @@ -11,6 +8,9 @@ import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.three.ThreeFactory.Companion.TYPE import space.kscience.visionforge.visible +import three.core.BufferGeometry +import three.core.Object3D +import three.math.Euler import kotlin.reflect.KClass /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt index fc226de6..e75e4847 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Float32BufferAttribute -import info.laht.threekt.math.Vector3 +import three.core.BufferGeometry +import three.core.Float32BufferAttribute +import three.math.Vector3 import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.solid.GeometryBuilder import space.kscience.visionforge.solid.Point3D diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt index 7c709a5c..3829698e 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.Object3D +import three.core.Object3D import space.kscience.visionforge.solid.SolidBase /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index c9244ea5..49796fb0 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.Object3D -import info.laht.threekt.geometries.TextBufferGeometry -import info.laht.threekt.objects.Mesh +import three.core.Object3D +import three.geometries.TextBufferGeometry +import three.objects.Mesh import kotlinx.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index 557a375f..adf4ce0d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Color -import info.laht.threekt.objects.LineSegments +import three.core.BufferGeometry +import three.core.Object3D +import three.math.Color +import three.objects.LineSegments import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 3826f11d..abcd5df5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -1,11 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.materials.LineBasicMaterial -import info.laht.threekt.materials.Material -import info.laht.threekt.materials.MeshBasicMaterial -import info.laht.threekt.materials.MeshStandardMaterial -import info.laht.threekt.math.Color -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -16,6 +10,12 @@ import space.kscience.visionforge.getStyleNodes import space.kscience.visionforge.solid.ColorAccessor import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.SolidReference +import three.materials.LineBasicMaterial +import three.materials.Material +import three.materials.MeshBasicMaterial +import three.materials.MeshStandardMaterial +import three.math.Color +import three.objects.Mesh public object ThreeMaterials { @@ -37,18 +37,6 @@ public object ThreeMaterials { cached = true } - public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { - color.set(Colors.ivory) - linewidth = 2.0 - cached = true - } - - public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { - color.set(Colors.blue) - linewidth = 2.0 - cached = true - } - private val lineMaterialCache = HashMap() private fun buildLineMaterial(meta: Meta): LineBasicMaterial = LineBasicMaterial().apply { @@ -124,7 +112,7 @@ public fun ColorAccessor.threeColor(): Color? { } } -private var Material.cached: Boolean +internal var Material.cached: Boolean get() = userData["cached"] == true set(value) { userData["cached"] = value diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index 1a68985f..ef7f5120 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -1,9 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.geometries.EdgesGeometry -import info.laht.threekt.objects.LineSegments -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -18,6 +14,10 @@ import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_OBJECT_NAME +import three.core.BufferGeometry +import three.geometries.EdgesGeometry +import three.objects.LineSegments +import three.objects.Mesh import kotlin.reflect.KClass /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt new file mode 100644 index 00000000..3d9b4c3b --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt @@ -0,0 +1,41 @@ +package space.kscience.visionforge.solid.three + +import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.solid.PolyLine +import space.kscience.visionforge.solid.color +import space.kscience.visionforge.solid.string +import three.core.Object3D +import three.math.Color +import three.meshline.MeshLine +import three.meshline.MeshLineMaterial +import three.objects.Mesh +import kotlin.math.ceil +import kotlin.reflect.KClass + +public object ThreeMeshLineFactory : ThreeFactory { + override val type: KClass get() = PolyLine::class + + override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { + val geometry = MeshLine( + Array((vision.points.size - 1) * 2) { + vision.points[ceil(it / 2.0).toInt()].toVector() + } + ) + + val material = MeshLineMaterial().apply { + thickness = vision.thickness.toFloat() + color = vision.color.string?.let { Color(it) } ?: ThreeMaterials.DEFAULT_LINE_COLOR + } + + return Mesh(geometry, material).apply { + updatePosition(vision) + //layers.enable(obj.layer) + //add listener to object properties + if (observe) { + vision.onPropertyChange(three.context) { propertyName -> + updateProperty(vision, propertyName) + } + } + } + } +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index ba30e88b..bae26853 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.Object3D import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.w3c.dom.Element @@ -15,9 +14,10 @@ import space.kscience.visionforge.VisionChildren import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible +import three.core.Object3D import kotlin.collections.set import kotlin.reflect.KClass -import info.laht.threekt.objects.Group as ThreeGroup +import three.objects.Group as ThreeGroup public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { override val tag: PluginTag get() = Companion.tag @@ -35,7 +35,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[Convex::class] = ThreeConvexFactory objectFactories[Sphere::class] = ThreeSphereFactory objectFactories[ConeSegment::class] = ThreeConeFactory - objectFactories[PolyLine::class] = ThreeLineFactory + objectFactories[PolyLine::class] = ThreeSmartLineFactory objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory objectFactories[PointLightSource::class] = ThreePointLightFactory @@ -182,7 +182,7 @@ internal fun Object3D.getOrCreateGroup(name: Name): Object3D { name.isEmpty() -> this name.length == 1 -> { val token = name.tokens.first() - children.find { it.name == token.toString() } ?: info.laht.threekt.objects.Group().also { group -> + children.find { it.name == token.toString() } ?: ThreeGroup().also { group -> group.name = token.toString() this.add(group) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt index 56df4b8b..fdd2e019 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -1,11 +1,11 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.lights.PointLight -import info.laht.threekt.math.Color import space.kscience.dataforge.names.asName import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.LightSource import space.kscience.visionforge.solid.PointLightSource +import three.lights.PointLight +import three.math.Color import kotlin.reflect.KClass public object ThreePointLightFactory : ThreeFactory { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index b0e1d69c..bde8c456 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -1,7 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.Object3D -import info.laht.threekt.objects.Mesh import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.cutFirst import space.kscience.dataforge.names.firstOrNull @@ -9,6 +7,8 @@ import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidReference import space.kscience.visionforge.solid.SolidReference.Companion.REFERENCE_CHILD_PROPERTY_PREFIX +import three.core.Object3D +import three.objects.Mesh import kotlin.reflect.KClass public object ThreeReferenceFactory : ThreeFactory { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt new file mode 100644 index 00000000..2e7329da --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt @@ -0,0 +1,17 @@ +package space.kscience.visionforge.solid.three + +import space.kscience.visionforge.solid.PolyLine +import three.core.Object3D +import kotlin.reflect.KClass + +public object ThreeSmartLineFactory : ThreeFactory { + override val type: KClass get() = PolyLine::class + + override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { + return if (vision.thickness == 1.0) { + ThreeLineFactory.build(three, vision, observe) + } else { + ThreeMeshLineFactory.build(three, vision, observe) + } + } +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt index 9d4926c5..8022a09c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.geometries.SphereGeometry import space.kscience.visionforge.solid.Sphere import space.kscience.visionforge.solid.detail +import three.core.BufferGeometry +import three.geometries.SphereGeometry public object ThreeSphereFactory : ThreeMeshFactory(Sphere::class) { override fun buildGeometry(obj: Sphere): BufferGeometry { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt index ac2fefc0..940d72c3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt @@ -10,10 +10,10 @@ @file:JsModule("three-csg-ts") @file:JsNonModule -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.math.Matrix4 -import info.laht.threekt.math.Vector3 -import info.laht.threekt.objects.Mesh +import three.core.BufferGeometry +import three.math.Matrix4 +import three.math.Vector3 +import three.objects.Mesh public external class CSG { public fun clone(): CSG diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index 94262052..9c9d5b2b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -1,16 +1,16 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Layers -import info.laht.threekt.core.Object3D -import info.laht.threekt.external.controls.OrbitControls -import info.laht.threekt.materials.Material -import info.laht.threekt.math.Vector3 -import info.laht.threekt.objects.Mesh -import info.laht.threekt.textures.Texture import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get +import three.core.BufferGeometry +import three.core.Layers +import three.core.Object3D +import three.external.controls.OrbitControls +import three.materials.Material +import three.math.Vector3 +import three.objects.Mesh +import three.textures.Texture import kotlin.contracts.contract import kotlin.math.PI diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/THREE.kt b/visionforge-threejs/src/main/kotlin/three/THREE.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/THREE.kt rename to visionforge-threejs/src/main/kotlin/three/THREE.kt index 3f8028cb..4dca1f62 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/THREE.kt +++ b/visionforge-threejs/src/main/kotlin/three/THREE.kt @@ -26,7 +26,7 @@ @file:JsNonModule @file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING", "unused") -package info.laht.threekt +package three external val REVISION: String diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationAction.kt b/visionforge-threejs/src/main/kotlin/three/animation/AnimationAction.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationAction.kt rename to visionforge-threejs/src/main/kotlin/three/animation/AnimationAction.kt index d0e9b073..185793ff 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationAction.kt +++ b/visionforge-threejs/src/main/kotlin/three/animation/AnimationAction.kt @@ -2,9 +2,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.animation +package three.animation -import info.laht.threekt.core.Object3D +import three.core.Object3D external class AnimationAction( mixer: AnimationMixer, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationClip.kt b/visionforge-threejs/src/main/kotlin/three/animation/AnimationClip.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationClip.kt rename to visionforge-threejs/src/main/kotlin/three/animation/AnimationClip.kt index 262f02dc..dfb1df5a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationClip.kt +++ b/visionforge-threejs/src/main/kotlin/three/animation/AnimationClip.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.animation +package three.animation /** * An AnimationClip is a reusable set of keyframe tracks which represent an animation. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationMixer.kt b/visionforge-threejs/src/main/kotlin/three/animation/AnimationMixer.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationMixer.kt rename to visionforge-threejs/src/main/kotlin/three/animation/AnimationMixer.kt index 383f88f7..45932e59 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationMixer.kt +++ b/visionforge-threejs/src/main/kotlin/three/animation/AnimationMixer.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.animation +package three.animation -import info.laht.threekt.core.Object3D +import three.core.Object3D /** * The AnimationMixer is a player for animations on a particular object in the scene. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationUtils.kt b/visionforge-threejs/src/main/kotlin/three/animation/AnimationUtils.kt similarity index 70% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationUtils.kt rename to visionforge-threejs/src/main/kotlin/three/animation/AnimationUtils.kt index 34a9633b..c0e05b3a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/AnimationUtils.kt +++ b/visionforge-threejs/src/main/kotlin/three/animation/AnimationUtils.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.animation +package three.animation external object AnimationUtils { //TODO diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/KeyFrameTrack.kt b/visionforge-threejs/src/main/kotlin/three/animation/KeyFrameTrack.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/KeyFrameTrack.kt rename to visionforge-threejs/src/main/kotlin/three/animation/KeyFrameTrack.kt index 478fd1f6..2f3f3436 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/animation/KeyFrameTrack.kt +++ b/visionforge-threejs/src/main/kotlin/three/animation/KeyFrameTrack.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.animation +package three.animation import org.khronos.webgl.Float32Array diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/Audio.kt b/visionforge-threejs/src/main/kotlin/three/audio/Audio.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/Audio.kt rename to visionforge-threejs/src/main/kotlin/three/audio/Audio.kt index f6266c41..95918ede 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/Audio.kt +++ b/visionforge-threejs/src/main/kotlin/three/audio/Audio.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.audio +package three.audio /** * Create a non-positional ( global ) audio object. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioContext.kt b/visionforge-threejs/src/main/kotlin/three/audio/AudioContext.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioContext.kt rename to visionforge-threejs/src/main/kotlin/three/audio/AudioContext.kt index 3bccd0ac..3908a548 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioContext.kt +++ b/visionforge-threejs/src/main/kotlin/three/audio/AudioContext.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.audio +package three.audio /** * This contains methods for setting up an AudioContext. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioListener.kt b/visionforge-threejs/src/main/kotlin/three/audio/AudioListener.kt similarity index 89% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioListener.kt rename to visionforge-threejs/src/main/kotlin/three/audio/AudioListener.kt index e99b9b13..cbdb06f1 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/AudioListener.kt +++ b/visionforge-threejs/src/main/kotlin/three/audio/AudioListener.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.audio +package three.audio -import info.laht.threekt.core.Object3D +import three.core.Object3D /** * Create a non-positional ( global ) audio object. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/PositionalAudio.kt b/visionforge-threejs/src/main/kotlin/three/audio/PositionalAudio.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/PositionalAudio.kt rename to visionforge-threejs/src/main/kotlin/three/audio/PositionalAudio.kt index 19c17bea..7c1006f4 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/audio/PositionalAudio.kt +++ b/visionforge-threejs/src/main/kotlin/three/audio/PositionalAudio.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.audio +package three.audio /** * Create a positional audio object. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/Camera.kt b/visionforge-threejs/src/main/kotlin/three/cameras/Camera.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/Camera.kt rename to visionforge-threejs/src/main/kotlin/three/cameras/Camera.kt index 6ab80298..5f1ba54f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/Camera.kt +++ b/visionforge-threejs/src/main/kotlin/three/cameras/Camera.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.cameras +package three.cameras -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Matrix4 -import info.laht.threekt.math.Vector3 +import three.core.Object3D +import three.math.Matrix4 +import three.math.Vector3 external interface View { var enabled: Boolean diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/OrthographicCamera.kt b/visionforge-threejs/src/main/kotlin/three/cameras/OrthographicCamera.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/OrthographicCamera.kt rename to visionforge-threejs/src/main/kotlin/three/cameras/OrthographicCamera.kt index 320d71b5..706c8746 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/OrthographicCamera.kt +++ b/visionforge-threejs/src/main/kotlin/three/cameras/OrthographicCamera.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.cameras +package three.cameras external class OrthographicCamera( varleft: Int, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/PerspectiveCamera.kt b/visionforge-threejs/src/main/kotlin/three/cameras/PerspectiveCamera.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/PerspectiveCamera.kt rename to visionforge-threejs/src/main/kotlin/three/cameras/PerspectiveCamera.kt index 4deee300..a5b12de8 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/cameras/PerspectiveCamera.kt +++ b/visionforge-threejs/src/main/kotlin/three/cameras/PerspectiveCamera.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.cameras +package three.cameras external class PerspectiveCamera(fov: Int, aspect: Double, near: Number, far: Number) : Camera { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferAttribute.kt b/visionforge-threejs/src/main/kotlin/three/core/BufferAttribute.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferAttribute.kt rename to visionforge-threejs/src/main/kotlin/three/core/BufferAttribute.kt index 6a773330..e045b2d6 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferAttribute.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/BufferAttribute.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core -import info.laht.threekt.math.Color -import info.laht.threekt.math.Vector2 -import info.laht.threekt.math.Vector3 -import info.laht.threekt.math.Vector4 +import three.math.Color +import three.math.Vector2 +import three.math.Vector3 +import three.math.Vector4 abstract external class BufferAttribute protected constructor( array: dynamic, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferGeometry.kt b/visionforge-threejs/src/main/kotlin/three/core/BufferGeometry.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/core/BufferGeometry.kt index 251627a7..5038aee7 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/BufferGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/BufferGeometry.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core -import info.laht.threekt.math.Box3 -import info.laht.threekt.math.Matrix4 -import info.laht.threekt.math.Sphere -import info.laht.threekt.math.Vector3 +import three.math.Box3 +import three.math.Matrix4 +import three.math.Sphere +import three.math.Vector3 /** * This class is an efficient alternative to Geometry, because it stores all data, including vertex positions, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Clock.kt b/visionforge-threejs/src/main/kotlin/three/core/Clock.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Clock.kt rename to visionforge-threejs/src/main/kotlin/three/core/Clock.kt index 8cce902c..e5925f56 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Clock.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Clock.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core /** * Object for keeping track of time. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/EventDispatcher.kt b/visionforge-threejs/src/main/kotlin/three/core/EventDispatcher.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/EventDispatcher.kt rename to visionforge-threejs/src/main/kotlin/three/core/EventDispatcher.kt index 459da88b..1646775e 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/EventDispatcher.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/EventDispatcher.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core external open class EventDispatcher { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Face3.kt b/visionforge-threejs/src/main/kotlin/three/core/Face3.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Face3.kt rename to visionforge-threejs/src/main/kotlin/three/core/Face3.kt index ff48d022..a7ec7f0b 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Face3.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Face3.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core -import info.laht.threekt.math.Color -import info.laht.threekt.math.Vector3 +import three.math.Color +import three.math.Vector3 external class Face3 { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/InstancedBufferGeometry.kt b/visionforge-threejs/src/main/kotlin/three/core/InstancedBufferGeometry.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/InstancedBufferGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/core/InstancedBufferGeometry.kt index 92137432..99c4df70 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/InstancedBufferGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/InstancedBufferGeometry.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core external class InstancedBufferGeometry : BufferGeometry { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Layers.kt b/visionforge-threejs/src/main/kotlin/three/core/Layers.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Layers.kt rename to visionforge-threejs/src/main/kotlin/three/core/Layers.kt index 503878d1..6d29399c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Layers.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Layers.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core /** * A Layers object assigns an Object3D to 1 or more of 32 layers numbered 0 to 31 - internally the diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Object3D.kt b/visionforge-threejs/src/main/kotlin/three/core/Object3D.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Object3D.kt rename to visionforge-threejs/src/main/kotlin/three/core/Object3D.kt index e49add5e..86739f76 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Object3D.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Object3D.kt @@ -26,9 +26,9 @@ @file:JsNonModule -package info.laht.threekt.core +package three.core -import info.laht.threekt.math.* +import three.math.* /** * This is the base class for most objects in three.js and provides a set of properties and methods for manipulating objects in 3D space. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Raycaster.kt b/visionforge-threejs/src/main/kotlin/three/core/Raycaster.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Raycaster.kt rename to visionforge-threejs/src/main/kotlin/three/core/Raycaster.kt index 2e2944af..e03844f6 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Raycaster.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Raycaster.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core -import info.laht.threekt.cameras.Camera -import info.laht.threekt.math.Ray -import info.laht.threekt.math.Vector2 -import info.laht.threekt.math.Vector3 +import three.cameras.Camera +import three.math.Ray +import three.math.Vector2 +import three.math.Vector3 external interface Params { var Mesh: dynamic diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Uniform.kt b/visionforge-threejs/src/main/kotlin/three/core/Uniform.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Uniform.kt rename to visionforge-threejs/src/main/kotlin/three/core/Uniform.kt index a92cdf2a..a2bef114 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/core/Uniform.kt +++ b/visionforge-threejs/src/main/kotlin/three/core/Uniform.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.core +package three.core external class Uniform { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/Detector.kt b/visionforge-threejs/src/main/kotlin/three/external/Detector.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/Detector.kt rename to visionforge-threejs/src/main/kotlin/three/external/Detector.kt index 716e5d74..3dc1ed28 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/Detector.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/Detector.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external +package three.external import org.w3c.dom.Element diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/ImprovedNoise.kt b/visionforge-threejs/src/main/kotlin/three/external/ImprovedNoise.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/ImprovedNoise.kt rename to visionforge-threejs/src/main/kotlin/three/external/ImprovedNoise.kt index bc380022..4ee3942d 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/ImprovedNoise.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/ImprovedNoise.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external +package three.external external object ImprovedNoise { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/SimplexNoise.kt b/visionforge-threejs/src/main/kotlin/three/external/SimplexNoise.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/SimplexNoise.kt rename to visionforge-threejs/src/main/kotlin/three/external/SimplexNoise.kt index f8ab5a82..6856c354 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/SimplexNoise.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/SimplexNoise.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external +package three.external external object SimplexNoise { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/FlyControls.kt b/visionforge-threejs/src/main/kotlin/three/external/controls/FlyControls.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/FlyControls.kt rename to visionforge-threejs/src/main/kotlin/three/external/controls/FlyControls.kt index 11e25207..77de67e0 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/FlyControls.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/controls/FlyControls.kt @@ -25,10 +25,10 @@ @file:JsModule("three/examples/jsm/controls/FlyControls.js") @file:JsNonModule -package info.laht.threekt.external.controls +package three.external.controls -import info.laht.threekt.core.Object3D import org.w3c.dom.Node +import three.core.Object3D external class FlyControls(`object`: Object3D, domElement: Node = definedExternally) { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/OrbitControls.kt b/visionforge-threejs/src/main/kotlin/three/external/controls/OrbitControls.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/OrbitControls.kt rename to visionforge-threejs/src/main/kotlin/three/external/controls/OrbitControls.kt index db7f2ac9..94223fc4 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/OrbitControls.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/controls/OrbitControls.kt @@ -25,11 +25,11 @@ @file:JsModule("three/examples/jsm/controls/OrbitControls.js") @file:JsNonModule -package info.laht.threekt.external.controls +package three.external.controls -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Vector3 import org.w3c.dom.Node +import three.core.Object3D +import three.math.Vector3 /** * This set of controls performs orbiting, dollying (zooming), and panning. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TrackballControls.kt b/visionforge-threejs/src/main/kotlin/three/external/controls/TrackballControls.kt similarity index 90% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TrackballControls.kt rename to visionforge-threejs/src/main/kotlin/three/external/controls/TrackballControls.kt index b128553e..64998dc2 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TrackballControls.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/controls/TrackballControls.kt @@ -9,13 +9,13 @@ @file:JsModule("three/examples/jsm/controls/TrackballControls.js") @file:JsNonModule -package info.laht.threekt.external.controls +package three.external.controls -import info.laht.threekt.cameras.Camera -import info.laht.threekt.core.EventDispatcher -import info.laht.threekt.math.Vector3 import org.w3c.dom.HTMLElement import org.w3c.dom.Node +import three.cameras.Camera +import three.core.EventDispatcher +import three.math.Vector3 external interface `T$0` { var left: Number diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TransformControls.kt b/visionforge-threejs/src/main/kotlin/three/external/controls/TransformControls.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TransformControls.kt rename to visionforge-threejs/src/main/kotlin/three/external/controls/TransformControls.kt index 0a1c7a43..e03da682 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/controls/TransformControls.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/controls/TransformControls.kt @@ -25,10 +25,10 @@ @file:JsModule("three/examples/jsm/controls/TransformControls.js") @file:JsNonModule -package info.laht.threekt.external.controls +package three.external.controls -import info.laht.threekt.core.Object3D import org.w3c.dom.Node +import three.core.Object3D external class TransformControls(`object`: Object3D, domElement: Node = definedExternally) : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/OBJExporter.kt b/visionforge-threejs/src/main/kotlin/three/external/exporters/OBJExporter.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/OBJExporter.kt rename to visionforge-threejs/src/main/kotlin/three/external/exporters/OBJExporter.kt index 36eefa9f..843a9f72 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/OBJExporter.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/exporters/OBJExporter.kt @@ -25,9 +25,9 @@ @file:JsModule("three/examples/jsm/exporters/OBJExporter.js") @file:JsNonModule -package info.laht.threekt.external.exporters +package three.external.exporters -import info.laht.threekt.core.Object3D +import three.core.Object3D external class OBJExporter { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/STLExporter.kt b/visionforge-threejs/src/main/kotlin/three/external/exporters/STLExporter.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/STLExporter.kt rename to visionforge-threejs/src/main/kotlin/three/external/exporters/STLExporter.kt index 4c6e3fb1..a89c1179 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/exporters/STLExporter.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/exporters/STLExporter.kt @@ -25,10 +25,10 @@ @file:JsModule("three/examples/jsm/exporters/STLExporter.js") @file:JsNonModule -package info.laht.threekt.external.exporters +package three.external.exporters -import info.laht.threekt.core.Object3D import org.khronos.webgl.DataView +import three.core.Object3D external class STLExporter { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/geometries/ConvexGeometry.kt b/visionforge-threejs/src/main/kotlin/three/external/geometries/ConvexGeometry.kt similarity index 61% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/geometries/ConvexGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/external/geometries/ConvexGeometry.kt index cbc0fbb5..6c981460 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/geometries/ConvexGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/geometries/ConvexGeometry.kt @@ -1,10 +1,10 @@ @file:JsModule("three/examples/jsm/geometries/ConvexGeometry.js") @file:JsNonModule -package info.laht.threekt.external.geometries +package three.external.geometries -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.math.Vector3 +import three.core.BufferGeometry +import three.math.Vector3 external class ConvexGeometry(points: Array) : BufferGeometry diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/GUIParams.kt b/visionforge-threejs/src/main/kotlin/three/external/libs/GUIParams.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/GUIParams.kt rename to visionforge-threejs/src/main/kotlin/three/external/libs/GUIParams.kt index 13d08a29..4b48bcc2 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/GUIParams.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/libs/GUIParams.kt @@ -1,4 +1,4 @@ -package info.laht.threekt.external.libs +package three.external.libs /** * @param name The name of this GUI diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/Stats.kt b/visionforge-threejs/src/main/kotlin/three/external/libs/Stats.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/Stats.kt rename to visionforge-threejs/src/main/kotlin/three/external/libs/Stats.kt index a6c2e86f..fd72886e 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/Stats.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/libs/Stats.kt @@ -25,7 +25,7 @@ @file:JsModule("three/examples/jsm/libs/stats.module.js") @file:JsNonModule -package info.laht.threekt.external.libs +package three.external.libs import org.w3c.dom.Node diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/datgui.kt b/visionforge-threejs/src/main/kotlin/three/external/libs/datgui.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/datgui.kt rename to visionforge-threejs/src/main/kotlin/three/external/libs/datgui.kt index c3496ea0..345d0cf5 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/libs/datgui.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/libs/datgui.kt @@ -24,7 +24,7 @@ @file:JsModule("three/examples/jsm/libs/dat.gui.module.js") @file:JsNonModule -package info.laht.threekt.external.libs +package three.external.libs import org.w3c.dom.Element diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/BabylonLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/BabylonLoader.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/BabylonLoader.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/BabylonLoader.kt index 2eae2988..437beba6 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/BabylonLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/BabylonLoader.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.core.Object3D -import info.laht.threekt.loaders.LoadingManager import org.w3c.xhr.XMLHttpRequest +import three.core.Object3D +import three.loaders.LoadingManager external class BabylonLoader( manager: LoadingManager = definedExternally diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/GLTFLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/GLTFLoader.kt similarity index 89% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/GLTFLoader.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/GLTFLoader.kt index e353372e..40fdd556 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/GLTFLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/GLTFLoader.kt @@ -1,14 +1,14 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.animation.AnimationClip -import info.laht.threekt.cameras.Camera -import info.laht.threekt.loaders.LoadingManager -import info.laht.threekt.scenes.Scene import org.khronos.webgl.ArrayBuffer import org.w3c.xhr.XMLHttpRequest +import three.animation.AnimationClip +import three.cameras.Camera +import three.loaders.LoadingManager +import three.scenes.Scene external interface GLTFOnLoadCallback { val animations: Array diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/LoaderSupport.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/LoaderSupport.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/LoaderSupport.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/LoaderSupport.kt index de1bafcd..5636fdc9 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/LoaderSupport.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/LoaderSupport.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders external object LoaderSupport { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/MTLLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/MTLLoader.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/MTLLoader.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/MTLLoader.kt index 9af877f5..1eecd588 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/MTLLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/MTLLoader.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.core.Object3D -import info.laht.threekt.loaders.LoadingManager import org.w3c.xhr.XMLHttpRequest +import three.core.Object3D +import three.loaders.LoadingManager external class MTLLoader( loadingManager: LoadingManager = definedExternally diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader.kt index ff4f2150..0bddd83a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.core.Object3D -import info.laht.threekt.loaders.LoadingManager -import info.laht.threekt.objects.Mesh import org.w3c.xhr.XMLHttpRequest +import three.core.Object3D +import three.loaders.LoadingManager +import three.objects.Mesh /** * A loader for loading a .obj resource. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader2.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader2.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader2.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader2.kt index 009e5e81..e12ad3fe 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/OBJLoader2.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/OBJLoader2.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.loaders.LoadingManager -import info.laht.threekt.objects.Mesh import org.w3c.xhr.XMLHttpRequest +import three.loaders.LoadingManager +import three.objects.Mesh external interface Detail { var loaderRootNode: Mesh diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/STLLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/STLLoader.kt rename to visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt index 707fdc0c..5fa253ab 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/loaders/STLLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.loaders +package three.external.loaders -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D import org.w3c.xhr.XMLHttpRequest +import three.core.BufferGeometry +import three.core.Object3D external class STLLoader { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Sky.kt b/visionforge-threejs/src/main/kotlin/three/external/objects/Sky.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Sky.kt rename to visionforge-threejs/src/main/kotlin/three/external/objects/Sky.kt index 47ad39ef..c7272138 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Sky.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/objects/Sky.kt @@ -25,8 +25,8 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.objects +package three.external.objects -import info.laht.threekt.objects.Mesh +import three.objects.Mesh external class Sky : Mesh \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Water.kt b/visionforge-threejs/src/main/kotlin/three/external/objects/Water.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Water.kt rename to visionforge-threejs/src/main/kotlin/three/external/objects/Water.kt index 9ad3f043..9a886a95 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/Water.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/objects/Water.kt @@ -25,8 +25,8 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.external.objects +package three.external.objects -import info.laht.threekt.objects.Mesh +import three.objects.Mesh external class Water(width: Int, height: Int, options: WaterOptions = definedExternally) : Mesh \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/WaterOptions.kt b/visionforge-threejs/src/main/kotlin/three/external/objects/WaterOptions.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/WaterOptions.kt rename to visionforge-threejs/src/main/kotlin/three/external/objects/WaterOptions.kt index 74434846..498f9883 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/external/objects/WaterOptions.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/objects/WaterOptions.kt @@ -22,10 +22,10 @@ * THE SOFTWARE. */ -package info.laht.threekt.external.objects +package three.external.objects -import info.laht.threekt.math.Vector3 -import info.laht.threekt.textures.Texture +import three.math.Vector3 +import three.textures.Texture data class WaterOptions( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/SceneUtils.kt b/visionforge-threejs/src/main/kotlin/three/extras/SceneUtils.kt similarity index 87% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/SceneUtils.kt rename to visionforge-threejs/src/main/kotlin/three/extras/SceneUtils.kt index fb4338fd..1ad837d0 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/SceneUtils.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/SceneUtils.kt @@ -1,13 +1,13 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras +package three.extras -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D -import info.laht.threekt.materials.Material -import info.laht.threekt.objects.Group -import info.laht.threekt.scenes.Scene +import three.core.BufferGeometry +import three.core.Object3D +import three.materials.Material +import three.objects.Group +import three.scenes.Scene /** * A class containing useful utility functions for scene manipulation. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Curve.kt b/visionforge-threejs/src/main/kotlin/three/extras/core/Curve.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Curve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/core/Curve.kt index f5a8ced6..4b688b1a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Curve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/core/Curve.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.core +package three.extras.core external abstract class Curve { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/CurvePath.kt b/visionforge-threejs/src/main/kotlin/three/extras/core/CurvePath.kt similarity index 89% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/CurvePath.kt rename to visionforge-threejs/src/main/kotlin/three/extras/core/CurvePath.kt index 18ae2165..5a05ab14 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/CurvePath.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/core/CurvePath.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.core +package three.extras.core open external class CurvePath : Curve { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Path.kt b/visionforge-threejs/src/main/kotlin/three/extras/core/Path.kt similarity index 61% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Path.kt rename to visionforge-threejs/src/main/kotlin/three/extras/core/Path.kt index 7b944a7c..bd78a31d 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/core/Path.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/core/Path.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.core +package three.extras.core -import info.laht.threekt.math.Vector2 +import three.math.Vector2 open external class Path : CurvePath { diff --git a/visionforge-threejs/src/main/kotlin/three/extras/core/Shape.kt b/visionforge-threejs/src/main/kotlin/three/extras/core/Shape.kt new file mode 100644 index 00000000..d05486b5 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/extras/core/Shape.kt @@ -0,0 +1,8 @@ +@file:JsModule("three") +@file:JsNonModule + +package three.extras.core + +import three.math.Vector2 + +external class Shape(points: Array) : Path \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/three/extras/core/ShapePath.kt b/visionforge-threejs/src/main/kotlin/three/extras/core/ShapePath.kt new file mode 100644 index 00000000..5ea28758 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/extras/core/ShapePath.kt @@ -0,0 +1,6 @@ +@file:JsModule("three") +@file:JsNonModule + +package three.extras.core + +external class ShapePath \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/ArcCurve.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/ArcCurve.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/ArcCurve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/ArcCurve.kt index a6f2d172..c3891ff1 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/ArcCurve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/ArcCurve.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves external class ArcCurve( aX: Number = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/CatmullRomCurve3.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/CatmullRomCurve3.kt similarity index 79% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/CatmullRomCurve3.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/CatmullRomCurve3.kt index 93a5d931..e968cfb0 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/CatmullRomCurve3.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/CatmullRomCurve3.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector3 +import three.extras.core.Curve +import three.math.Vector3 external class CatmullRomCurve3( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/EllipseCurve.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/EllipseCurve.kt similarity index 85% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/EllipseCurve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/EllipseCurve.kt index d3ead4c5..dbcaec3f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/EllipseCurve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/EllipseCurve.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector2 +import three.extras.core.Curve +import three.math.Vector2 open external class EllipseCurve( aX: Number = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve.kt similarity index 66% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve.kt index ca9dc41b..74c2d239 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector2 +import three.extras.core.Curve +import three.math.Vector2 external class LineCurve( v1: Vector2 = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve3.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve3.kt similarity index 67% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve3.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve3.kt index 90218d60..68f14b72 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/LineCurve3.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/LineCurve3.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector3 +import three.extras.core.Curve +import three.math.Vector3 external class LineCurve3( v1: Vector3 = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve.kt similarity index 74% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve.kt index aa7b2a95..849b41c0 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector2 +import three.extras.core.Curve +import three.math.Vector2 external class QuadricBezierCurve : Curve { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve3.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve3.kt similarity index 74% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve3.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve3.kt index b4b30426..0da5444f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/QuadricBezierCurve3.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/QuadricBezierCurve3.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector3 +import three.extras.core.Curve +import three.math.Vector3 external class QuadricBezierCurve3 : Curve { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/SplineCurve.kt b/visionforge-threejs/src/main/kotlin/three/extras/curves/SplineCurve.kt similarity index 67% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/SplineCurve.kt rename to visionforge-threejs/src/main/kotlin/three/extras/curves/SplineCurve.kt index df3fb8cd..357cf50f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/extras/curves/SplineCurve.kt +++ b/visionforge-threejs/src/main/kotlin/three/extras/curves/SplineCurve.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.extras.curves +package three.extras.curves -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector2 +import three.extras.core.Curve +import three.math.Vector2 external class SplineCurve( points: Array = definedExternally diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/BoxGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/BoxGeometry.kt similarity index 77% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/BoxGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/BoxGeometry.kt index 8d0e5ec5..d80a96a2 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/BoxGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/BoxGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class BoxGeometry( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ConeGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/ConeGeometry.kt similarity index 79% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ConeGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/ConeGeometry.kt index f98ad2dd..7492d5ec 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ConeGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/ConeGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class ConeGeometry( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/CylinderGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/CylinderGeometry.kt similarity index 78% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/CylinderGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/CylinderGeometry.kt index b10e5c11..f2f1160c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/CylinderGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/CylinderGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class CylinderGeometry( radiusTop: Number, diff --git a/visionforge-threejs/src/main/kotlin/three/geometries/EdgesGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/EdgesGeometry.kt new file mode 100644 index 00000000..fe53213e --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/geometries/EdgesGeometry.kt @@ -0,0 +1,8 @@ +@file:JsModule("three") +@file:JsNonModule + +package three.geometries + +import three.core.BufferGeometry + +public external class EdgesGeometry(geometry: BufferGeometry, thresholdAngle: Int = definedExternally) : BufferGeometry \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ExtrudeGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/ExtrudeGeometry.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ExtrudeGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/ExtrudeGeometry.kt index 4b30e7af..5c256878 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/ExtrudeGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/ExtrudeGeometry.kt @@ -8,11 +8,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.extras.core.Shape -import info.laht.threekt.math.Vector2 +import three.core.BufferGeometry +import three.extras.core.Shape +import three.math.Vector2 external interface ExtrudeGeometryOptions { var curveSegments: Number? diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/PlaneGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/PlaneGeometry.kt similarity index 67% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/PlaneGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/PlaneGeometry.kt index 0b1072ef..aff535a2 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/PlaneGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/PlaneGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class PlaneGeometry( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/SphereGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/SphereGeometry.kt similarity index 78% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/SphereGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/SphereGeometry.kt index 5b0c9fc6..2b9e5279 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/SphereGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/SphereGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class SphereGeometry( radius: Number, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TextGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/TextGeometry.kt similarity index 96% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TextGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/TextGeometry.kt index b8c935f3..aab53955 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TextGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/TextGeometry.kt @@ -1,7 +1,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries external interface TextGeometryParameters { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TorusGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/TorusGeometry.kt similarity index 73% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TorusGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/TorusGeometry.kt index 0a53525f..493b7984 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TorusGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/TorusGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry external class TorusGeometry( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TubeGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/TubeGeometry.kt similarity index 72% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TubeGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/TubeGeometry.kt index 36afa6ae..e1dc9a75 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/TubeGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/TubeGeometry.kt @@ -1,8 +1,8 @@ -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.extras.core.Curve -import info.laht.threekt.math.Vector3 +import three.core.BufferGeometry +import three.extras.core.Curve +import three.math.Vector3 /** diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/WireframeGeometry.kt b/visionforge-threejs/src/main/kotlin/three/geometries/WireframeGeometry.kt similarity index 68% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/WireframeGeometry.kt rename to visionforge-threejs/src/main/kotlin/three/geometries/WireframeGeometry.kt index f52c61cc..622ef80d 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/geometries/WireframeGeometry.kt +++ b/visionforge-threejs/src/main/kotlin/three/geometries/WireframeGeometry.kt @@ -1,9 +1,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.geometries +package three.geometries -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry /** * This can be used as a helper object to view a Geometry object as a wireframe. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/ArrowHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/ArrowHelper.kt similarity index 87% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/ArrowHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/ArrowHelper.kt index ea1764dd..18c0d8de 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/ArrowHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/ArrowHelper.kt @@ -25,13 +25,13 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Color -import info.laht.threekt.math.Vector3 -import info.laht.threekt.objects.Line -import info.laht.threekt.objects.Mesh +import three.core.Object3D +import three.math.Color +import three.math.Vector3 +import three.objects.Line +import three.objects.Mesh external class ArrowHelper( dir: Vector3, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/AxesHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/AxesHelper.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/AxesHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/AxesHelper.kt index d4b515be..5927991f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/AxesHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/AxesHelper.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.objects.LineSegments +import three.objects.LineSegments external class AxesHelper( size: Int = definedExternally diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/Box3Helper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/Box3Helper.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/Box3Helper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/Box3Helper.kt index 27aef631..1eefb43b 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/Box3Helper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/Box3Helper.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.math.Box3 -import info.laht.threekt.objects.LineSegments +import three.math.Box3 +import three.objects.LineSegments /** * Helper object to visualize a Box3. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/CameraHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/CameraHelper.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/CameraHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/CameraHelper.kt index 6b199f3f..716f8234 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/CameraHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/CameraHelper.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.cameras.Camera -import info.laht.threekt.objects.LineSegments +import three.cameras.Camera +import three.objects.LineSegments external class CameraHelper( camera: Camera diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/GridHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/GridHelper.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/GridHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/GridHelper.kt index 0d987ae5..0c080ead 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/GridHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/GridHelper.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.objects.LineSegments +import three.objects.LineSegments external class GridHelper( size: Int = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/HemisphereLightHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/HemisphereLightHelper.kt similarity index 91% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/HemisphereLightHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/HemisphereLightHelper.kt index 4351faa7..23f21837 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/HemisphereLightHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/HemisphereLightHelper.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.core.Object3D -import info.laht.threekt.lights.HemisphereLight -import info.laht.threekt.lights.Light +import three.core.Object3D +import three.lights.HemisphereLight +import three.lights.Light /** * Creates a visual aid consisting of a spherical Mesh for a HemisphereLight. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/PlaneHelper.kt b/visionforge-threejs/src/main/kotlin/three/helpers/PlaneHelper.kt similarity index 58% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/PlaneHelper.kt rename to visionforge-threejs/src/main/kotlin/three/helpers/PlaneHelper.kt index dbe6dc8d..338c9593 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/helpers/PlaneHelper.kt +++ b/visionforge-threejs/src/main/kotlin/three/helpers/PlaneHelper.kt @@ -1,10 +1,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.helpers +package three.helpers -import info.laht.threekt.math.Color -import info.laht.threekt.math.Plane -import info.laht.threekt.objects.LineSegments +import three.math.Color +import three.math.Plane +import three.objects.LineSegments /** * Helper object to visualize a [Plane]. diff --git a/visionforge-threejs/src/main/kotlin/three/ktutils.kt b/visionforge-threejs/src/main/kotlin/three/ktutils.kt new file mode 100644 index 00000000..d0735c84 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/ktutils.kt @@ -0,0 +1,9 @@ +@file:Suppress("FunctionName") + +package three + +import three.renderers.WebGLRenderer +import three.renderers.WebGLRendererParams + +fun WebGLRenderer(builder: WebGLRendererParams.() -> Unit): WebGLRenderer = + WebGLRenderer(WebGLRendererParams().apply(builder)) \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/AmbientLight.kt b/visionforge-threejs/src/main/kotlin/three/lights/AmbientLight.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/AmbientLight.kt rename to visionforge-threejs/src/main/kotlin/three/lights/AmbientLight.kt index 0d2cae66..b5ddd88d 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/AmbientLight.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/AmbientLight.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights /** * This light globally illuminates all objects in the scene equally. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLight.kt b/visionforge-threejs/src/main/kotlin/three/lights/DirectionalLight.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLight.kt rename to visionforge-threejs/src/main/kotlin/three/lights/DirectionalLight.kt index f85d3e24..482fd628 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLight.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/DirectionalLight.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights -import info.laht.threekt.core.Object3D +import three.core.Object3D external class DirectionalLight( color: Int = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLightShadow.kt b/visionforge-threejs/src/main/kotlin/three/lights/DirectionalLightShadow.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLightShadow.kt rename to visionforge-threejs/src/main/kotlin/three/lights/DirectionalLightShadow.kt index e2886e0b..205c46bb 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/DirectionalLightShadow.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/DirectionalLightShadow.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights external class DirectionalLightShadow : LightShadow { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/HemisphereLight.kt b/visionforge-threejs/src/main/kotlin/three/lights/HemisphereLight.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/HemisphereLight.kt rename to visionforge-threejs/src/main/kotlin/three/lights/HemisphereLight.kt index c98fbd5d..bf761479 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/HemisphereLight.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/HemisphereLight.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights -import info.laht.threekt.math.Color +import three.math.Color /** * A light source positioned directly above the scene, with color fading from the sky color to the ground color. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/Light.kt b/visionforge-threejs/src/main/kotlin/three/lights/Light.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/Light.kt rename to visionforge-threejs/src/main/kotlin/three/lights/Light.kt index 6ffd9a2d..d0c07d15 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/Light.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/Light.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights -import info.laht.threekt.core.Object3D -import info.laht.threekt.math.Color +import three.core.Object3D +import three.math.Color /** * Abstract base class for lights - all other light types inherit the properties and methods described here. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/LightShadow.kt b/visionforge-threejs/src/main/kotlin/three/lights/LightShadow.kt similarity index 90% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/LightShadow.kt rename to visionforge-threejs/src/main/kotlin/three/lights/LightShadow.kt index ef62b843..b7fc1f12 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/LightShadow.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/LightShadow.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights -import info.laht.threekt.cameras.Camera -import info.laht.threekt.math.Matrix4 -import info.laht.threekt.math.Vector2 +import three.cameras.Camera +import three.math.Matrix4 +import three.math.Vector2 open external class LightShadow(camera: Camera) { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/PointLight.kt b/visionforge-threejs/src/main/kotlin/three/lights/PointLight.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/PointLight.kt rename to visionforge-threejs/src/main/kotlin/three/lights/PointLight.kt index 6a708e58..9ff6627a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/PointLight.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/PointLight.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights external class PointLight( color: Int = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLight.kt b/visionforge-threejs/src/main/kotlin/three/lights/SpotLight.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLight.kt rename to visionforge-threejs/src/main/kotlin/three/lights/SpotLight.kt index 70c14e6a..ebd422f7 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLight.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/SpotLight.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights -import info.laht.threekt.core.Object3D +import three.core.Object3D external class SpotLight( color: Int = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLightShadow.kt b/visionforge-threejs/src/main/kotlin/three/lights/SpotLightShadow.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLightShadow.kt rename to visionforge-threejs/src/main/kotlin/three/lights/SpotLightShadow.kt index 8d8e052f..14df1315 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/lights/SpotLightShadow.kt +++ b/visionforge-threejs/src/main/kotlin/three/lights/SpotLightShadow.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.lights +package three.lights external class SpotLightShadow : LightShadow { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Cache.kt b/visionforge-threejs/src/main/kotlin/three/loaders/Cache.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Cache.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/Cache.kt index 1424d8e7..38278cf1 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Cache.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/Cache.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders external object Cache { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/CompressedTextureLoader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/CompressedTextureLoader.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/CompressedTextureLoader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/CompressedTextureLoader.kt index 889c5d18..d827d4a5 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/CompressedTextureLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/CompressedTextureLoader.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders -import info.laht.threekt.textures.Texture import org.w3c.xhr.XMLHttpRequest +import three.textures.Texture /** * Abstract base class for block based textures loader (dds, pvr, ...). diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/ImageLoader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/ImageLoader.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/ImageLoader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/ImageLoader.kt index ade47d72..555f268b 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/ImageLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/ImageLoader.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders import org.w3c.dom.Element import org.w3c.xhr.XMLHttpRequest diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/JSONLoader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/JSONLoader.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/JSONLoader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/JSONLoader.kt index db38edb6..8871b540 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/JSONLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/JSONLoader.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D -import info.laht.threekt.materials.Material import org.w3c.xhr.XMLHttpRequest +import three.core.BufferGeometry +import three.core.Object3D +import three.materials.Material /** * A loader for loading objects in JSON format. This uses the FileLoader internally for loading files. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Loader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/Loader.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Loader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/Loader.kt index 2d60ee93..d094b6d9 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/Loader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/Loader.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders /** * Base class for implementing loaders. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/LoadingManager.kt b/visionforge-threejs/src/main/kotlin/three/loaders/LoadingManager.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/LoadingManager.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/LoadingManager.kt index ebf5d2bc..e9180dad 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/LoadingManager.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/LoadingManager.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders external object DefaultLoadingManager : LoadingManager diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/MaterialLoader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/MaterialLoader.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/MaterialLoader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/MaterialLoader.kt index ef30c71f..f294ffd5 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/MaterialLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/MaterialLoader.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders -import info.laht.threekt.materials.Material -import info.laht.threekt.textures.Texture import org.w3c.xhr.XMLHttpRequest +import three.materials.Material +import three.textures.Texture external class MaterialLoader { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/TextureLoader.kt b/visionforge-threejs/src/main/kotlin/three/loaders/TextureLoader.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/TextureLoader.kt rename to visionforge-threejs/src/main/kotlin/three/loaders/TextureLoader.kt index 5d57ab88..5ddac48b 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/loaders/TextureLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/loaders/TextureLoader.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.loaders +package three.loaders -import info.laht.threekt.textures.Texture import org.w3c.xhr.XMLHttpRequest +import three.textures.Texture /** * Class for loading a texture. This uses the ImageLoader internally for loading files. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineBasicMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/LineBasicMaterial.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineBasicMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/LineBasicMaterial.kt index 308e5a52..1445c427 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineBasicMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/LineBasicMaterial.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color +import three.math.Color open external class LineBasicMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineDashedMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/LineDashedMaterial.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineDashedMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/LineDashedMaterial.kt index 79ad5ada..aa2a5d6a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/LineDashedMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/LineDashedMaterial.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials external class LineDashedMaterial : LineBasicMaterial { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/Material.kt b/visionforge-threejs/src/main/kotlin/three/materials/Material.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/Material.kt rename to visionforge-threejs/src/main/kotlin/three/materials/Material.kt index 9a2b72d0..2edbca90 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/Material.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/Material.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials @JsName("Material") open external class Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshBasicMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshBasicMaterial.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshBasicMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshBasicMaterial.kt index 96eae5e0..f1ee1f27 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshBasicMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshBasicMaterial.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.textures.Texture +import three.math.Color +import three.textures.Texture external class MeshBasicMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshDepthMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshDepthMaterial.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshDepthMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshDepthMaterial.kt index 185dce93..584bcab6 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshDepthMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshDepthMaterial.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.textures.Texture +import three.textures.Texture external class MeshDepthMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshLambertMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshLambertMaterial.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshLambertMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshLambertMaterial.kt index dcd0670a..089c96c1 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshLambertMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshLambertMaterial.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.textures.Texture +import three.math.Color +import three.textures.Texture external class MeshLambertMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshNormalMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshNormalMaterial.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshNormalMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshNormalMaterial.kt index ea7c0960..5972a702 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshNormalMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshNormalMaterial.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Vector2 -import info.laht.threekt.textures.Texture +import three.math.Vector2 +import three.textures.Texture external class MeshNormalMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhongMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshPhongMaterial.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhongMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshPhongMaterial.kt index 693ba8b4..eaabf8ca 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhongMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshPhongMaterial.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.math.Vector2 -import info.laht.threekt.textures.Texture +import three.math.Color +import three.math.Vector2 +import three.textures.Texture external class MeshPhongMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhysicalMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshPhysicalMaterial.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhysicalMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshPhysicalMaterial.kt index 42fef98f..e6674917 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshPhysicalMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshPhysicalMaterial.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials external class MeshPhysicalMaterial : MeshStandardMaterial { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshStandardMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/MeshStandardMaterial.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshStandardMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/MeshStandardMaterial.kt index 19b6901e..137ee095 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/MeshStandardMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/MeshStandardMaterial.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.math.Vector2 -import info.laht.threekt.textures.Texture +import three.math.Color +import three.math.Vector2 +import three.textures.Texture open external class MeshStandardMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/PointsMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/PointsMaterial.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/PointsMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/PointsMaterial.kt index bb9c4bd8..a46fb65e 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/PointsMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/PointsMaterial.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.textures.Texture +import three.math.Color +import three.textures.Texture external class PointsMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/RawShaderMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/RawShaderMaterial.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/RawShaderMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/RawShaderMaterial.kt index 2a096459..d1f53c16 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/RawShaderMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/RawShaderMaterial.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials external class RawShaderMaterial : ShaderMaterial { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/ShaderMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/ShaderMaterial.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/ShaderMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/ShaderMaterial.kt index 016520eb..3ca841db 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/ShaderMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/ShaderMaterial.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials open external class ShaderMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/SpriteMaterial.kt b/visionforge-threejs/src/main/kotlin/three/materials/SpriteMaterial.kt similarity index 92% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/SpriteMaterial.kt rename to visionforge-threejs/src/main/kotlin/three/materials/SpriteMaterial.kt index 32056537..13587157 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/materials/SpriteMaterial.kt +++ b/visionforge-threejs/src/main/kotlin/three/materials/SpriteMaterial.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.materials +package three.materials -import info.laht.threekt.math.Color -import info.laht.threekt.textures.Texture +import three.math.Color +import three.textures.Texture external class SpriteMaterial : Material { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box2.kt b/visionforge-threejs/src/main/kotlin/three/math/Box2.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box2.kt rename to visionforge-threejs/src/main/kotlin/three/math/Box2.kt index c00da8eb..5b446e3c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box2.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Box2.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Box2( min: Vector2 = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box3.kt b/visionforge-threejs/src/main/kotlin/three/math/Box3.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box3.kt rename to visionforge-threejs/src/main/kotlin/three/math/Box3.kt index a34622fa..25730ad2 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Box3.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Box3.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math -import info.laht.threekt.core.Object3D +import three.core.Object3D /** * Represents a box or cube in 3D space. The main purpose of this is to represent the Minimum Bounding Boxes for objects. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Color.kt b/visionforge-threejs/src/main/kotlin/three/math/Color.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Color.kt rename to visionforge-threejs/src/main/kotlin/three/math/Color.kt index 26a2a760..485d04f1 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Color.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Color.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Color { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/ColorConstants.kt b/visionforge-threejs/src/main/kotlin/three/math/ColorConstants.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/ColorConstants.kt rename to visionforge-threejs/src/main/kotlin/three/math/ColorConstants.kt index 34475bd1..e60aba4a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/ColorConstants.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/ColorConstants.kt @@ -23,7 +23,7 @@ */ -package info.laht.threekt.math +package three.math object ColorConstants { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Cylindrical.kt b/visionforge-threejs/src/main/kotlin/three/math/Cylindrical.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Cylindrical.kt rename to visionforge-threejs/src/main/kotlin/three/math/Cylindrical.kt index 9e0cd8ba..bee46185 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Cylindrical.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Cylindrical.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Cylindrical( radius: Number, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Euler.kt b/visionforge-threejs/src/main/kotlin/three/math/Euler.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Euler.kt rename to visionforge-threejs/src/main/kotlin/three/math/Euler.kt index 5b8dc1ce..5cd2f5cf 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Euler.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Euler.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Euler( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Frustrum.kt b/visionforge-threejs/src/main/kotlin/three/math/Frustrum.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Frustrum.kt rename to visionforge-threejs/src/main/kotlin/three/math/Frustrum.kt index cce6a0bc..8d6fe374 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Frustrum.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Frustrum.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Frustrum( p0: Plane = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Line3.kt b/visionforge-threejs/src/main/kotlin/three/math/Line3.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Line3.kt rename to visionforge-threejs/src/main/kotlin/three/math/Line3.kt index 6bb1b4e2..4596edd9 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Line3.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Line3.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Line3( start: Vector3 = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Math.kt b/visionforge-threejs/src/main/kotlin/three/math/Math.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Math.kt rename to visionforge-threejs/src/main/kotlin/three/math/Math.kt index 9bae9dba..7a340d51 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Math.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Math.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Math { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix3.kt b/visionforge-threejs/src/main/kotlin/three/math/Matrix3.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix3.kt rename to visionforge-threejs/src/main/kotlin/three/math/Matrix3.kt index 6f31380b..f5ea461a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix3.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Matrix3.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math -import info.laht.threekt.core.BufferAttribute +import three.core.BufferAttribute external class Matrix3 { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix4.kt b/visionforge-threejs/src/main/kotlin/three/math/Matrix4.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix4.kt rename to visionforge-threejs/src/main/kotlin/three/math/Matrix4.kt index 49ed3bfe..20e03eae 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Matrix4.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Matrix4.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry /** * A class representing a 4x4 matrix. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Plane.kt b/visionforge-threejs/src/main/kotlin/three/math/Plane.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Plane.kt rename to visionforge-threejs/src/main/kotlin/three/math/Plane.kt index 2848938d..41568fc8 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Plane.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Plane.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Plane() { constructor(normal: Vector3, constant: Double) diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Quaternion.kt b/visionforge-threejs/src/main/kotlin/three/math/Quaternion.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Quaternion.kt rename to visionforge-threejs/src/main/kotlin/three/math/Quaternion.kt index a3a0af8b..b1916723 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Quaternion.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Quaternion.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Quaternion( diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Ray.kt b/visionforge-threejs/src/main/kotlin/three/math/Ray.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Ray.kt rename to visionforge-threejs/src/main/kotlin/three/math/Ray.kt index 731a3d2b..707985b9 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Ray.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Ray.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Ray { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Sphere.kt b/visionforge-threejs/src/main/kotlin/three/math/Sphere.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Sphere.kt rename to visionforge-threejs/src/main/kotlin/three/math/Sphere.kt index cbbc24c4..abea7add 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Sphere.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Sphere.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Sphere { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Spherical.kt b/visionforge-threejs/src/main/kotlin/three/math/Spherical.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Spherical.kt rename to visionforge-threejs/src/main/kotlin/three/math/Spherical.kt index 187dcd94..1596bd25 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Spherical.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Spherical.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Spherical { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Triangle.kt b/visionforge-threejs/src/main/kotlin/three/math/Triangle.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Triangle.kt rename to visionforge-threejs/src/main/kotlin/three/math/Triangle.kt index 9dd99c52..890d1f87 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Triangle.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Triangle.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Triangle( a: Vector3 = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector2.kt b/visionforge-threejs/src/main/kotlin/three/math/Vector2.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector2.kt rename to visionforge-threejs/src/main/kotlin/three/math/Vector2.kt index 86049df0..c508421a 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector2.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Vector2.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Vector2( x: Number = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector3.kt b/visionforge-threejs/src/main/kotlin/three/math/Vector3.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector3.kt rename to visionforge-threejs/src/main/kotlin/three/math/Vector3.kt index 85f1c74b..881bc586 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector3.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Vector3.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math -import info.laht.threekt.cameras.Camera +import three.cameras.Camera /** * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers (labeled x, y, and z), which can be used to represent a number of things, such as: diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector4.kt b/visionforge-threejs/src/main/kotlin/three/math/Vector4.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector4.kt rename to visionforge-threejs/src/main/kotlin/three/math/Vector4.kt index f017f4d4..5bd672d5 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/Vector4.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/Vector4.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.math +package three.math external class Vector4( x: Number = definedExternally, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/operators.kt b/visionforge-threejs/src/main/kotlin/three/math/operators.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/math/operators.kt rename to visionforge-threejs/src/main/kotlin/three/math/operators.kt index b30baf00..245cc83f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/math/operators.kt +++ b/visionforge-threejs/src/main/kotlin/three/math/operators.kt @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package info.laht.threekt.math +package three.math operator fun Vector3.unaryMinus() = this.clone().negate() operator fun Vector3.plusAssign(v: Vector3) = this.let { add(v); Unit } diff --git a/visionforge-threejs/src/main/kotlin/three/meshline/MeshLine.kt b/visionforge-threejs/src/main/kotlin/three/meshline/MeshLine.kt new file mode 100644 index 00000000..21e0ce34 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/meshline/MeshLine.kt @@ -0,0 +1,37 @@ +@file:JsModule("three.meshline") +@file:JsNonModule + +package three.meshline + +import three.core.BufferGeometry +import three.materials.ShaderMaterial +import three.math.Color +import three.math.Vector3 +import three.textures.Texture + +/* + * https://github.com/spite/THREE.MeshLine + */ + +public external class MeshLine : BufferGeometry { + public fun setGeometry(geometry: BufferGeometry) + public fun setPoints(points: Array) +} + +public external class MeshLineMaterial : ShaderMaterial { + @JsName("lineWidth") + public var thickness: Float + public var color: Color + + public var map: Texture? + public var useMap: Boolean + public var alphaMap: Texture? + public var useAlphaMap: Boolean + + public var repeat: dynamic // - THREE.Vector2 to define the texture tiling (applies to map and alphaMap - MIGHT CHANGE IN THE FUTURE) + public var dashArray: dynamic //- the length and space between dashes. (0 - no dash) + public var dashOffset: dynamic // - defines the location where the dash will begin. Ideal to animate the line. + public var dashRatio: dynamic // - defines the ratio between that is visible or not (0 - more visible, 1 - more invisible). + public var resolution: dynamic // - THREE.Vector2 specifying the canvas size (REQUIRED) + public var sizeAttenuation: Int // - makes the line width constant regardless distance (1 unit is 1px on screen) (0 - attenuate, 1 - don't attenuate) +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt b/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt new file mode 100644 index 00000000..a2bfa57a --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt @@ -0,0 +1,8 @@ +package three.meshline + +import three.core.BufferGeometry +import three.math.Vector3 + +public fun MeshLine(geometry: BufferGeometry): MeshLine = MeshLine().apply { setGeometry(geometry) } + +public fun MeshLine(points: Array): MeshLine = MeshLine().apply { setPoints(points) } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Group.kt b/visionforge-threejs/src/main/kotlin/three/objects/Group.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Group.kt rename to visionforge-threejs/src/main/kotlin/three/objects/Group.kt index e5420f29..a280a11f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Group.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/Group.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.Object3D +import three.core.Object3D external class Group : Object3D diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LOD.kt b/visionforge-threejs/src/main/kotlin/three/objects/LOD.kt similarity index 88% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LOD.kt rename to visionforge-threejs/src/main/kotlin/three/objects/LOD.kt index 89e405ac..4eec3195 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LOD.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/LOD.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.cameras.Camera -import info.laht.threekt.core.Intersect -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster +import three.cameras.Camera +import three.core.Intersect +import three.core.Object3D +import three.core.Raycaster external class LOD : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Line.kt b/visionforge-threejs/src/main/kotlin/three/objects/Line.kt similarity index 85% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Line.kt rename to visionforge-threejs/src/main/kotlin/three/objects/Line.kt index e0a217bc..799884f8 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Line.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/Line.kt @@ -25,13 +25,13 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Intersect -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster -import info.laht.threekt.materials.Material +import three.core.BufferGeometry +import three.core.Intersect +import three.core.Object3D +import three.core.Raycaster +import three.materials.Material open external class Line(geometry: BufferGeometry, material: Material) : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineLoop.kt b/visionforge-threejs/src/main/kotlin/three/objects/LineLoop.kt similarity index 90% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineLoop.kt rename to visionforge-threejs/src/main/kotlin/three/objects/LineLoop.kt index 50aa390e..e3e8cbc3 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineLoop.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/LineLoop.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.materials.Material +import three.core.BufferGeometry +import three.materials.Material external class LineLoop(geometry: BufferGeometry, material: Material) : Line \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineSegments.kt b/visionforge-threejs/src/main/kotlin/three/objects/LineSegments.kt similarity index 89% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineSegments.kt rename to visionforge-threejs/src/main/kotlin/three/objects/LineSegments.kt index 03bef34e..2ffd85ee 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/LineSegments.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/LineSegments.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Object3D -import info.laht.threekt.materials.Material +import three.core.BufferGeometry +import three.core.Object3D +import three.materials.Material open external class LineSegments(geometry: BufferGeometry, material: Material) : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Mesh.kt b/visionforge-threejs/src/main/kotlin/three/objects/Mesh.kt similarity index 86% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Mesh.kt rename to visionforge-threejs/src/main/kotlin/three/objects/Mesh.kt index fc91e333..867b8000 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Mesh.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/Mesh.kt @@ -25,13 +25,13 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.BufferGeometry -import info.laht.threekt.core.Intersect -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster -import info.laht.threekt.materials.Material +import three.core.BufferGeometry +import three.core.Intersect +import three.core.Object3D +import three.core.Raycaster +import three.materials.Material open external class Mesh(geometry: BufferGeometry?, material: Material?) : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Points.kt b/visionforge-threejs/src/main/kotlin/three/objects/Points.kt similarity index 87% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Points.kt rename to visionforge-threejs/src/main/kotlin/three/objects/Points.kt index f296937a..7fede72c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Points.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/Points.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.Intersect -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster -import info.laht.threekt.materials.Material +import three.core.Intersect +import three.core.Object3D +import three.core.Raycaster +import three.materials.Material external class Points : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Sprite.kt b/visionforge-threejs/src/main/kotlin/three/objects/Sprite.kt similarity index 87% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Sprite.kt rename to visionforge-threejs/src/main/kotlin/three/objects/Sprite.kt index 60e2d0de..c9e06bac 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/objects/Sprite.kt +++ b/visionforge-threejs/src/main/kotlin/three/objects/Sprite.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.objects +package three.objects -import info.laht.threekt.core.Intersect -import info.laht.threekt.core.Object3D -import info.laht.threekt.core.Raycaster -import info.laht.threekt.materials.Material +import three.core.Intersect +import three.core.Object3D +import three.core.Raycaster +import three.materials.Material external class Sprite(material: Material = definedExternally) : Object3D { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2Renderer.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGL2Renderer.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2Renderer.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGL2Renderer.kt index 1c5208ad..7ca6120f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2Renderer.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGL2Renderer.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers +package three.renderers -import info.laht.threekt.cameras.Camera -import info.laht.threekt.scenes.Scene +import three.cameras.Camera +import three.scenes.Scene external class WebGL2Renderer { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2RendererParams.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGL2RendererParams.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2RendererParams.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGL2RendererParams.kt index a2ef9eaf..8379d142 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGL2RendererParams.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGL2RendererParams.kt @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package info.laht.threekt.renderers +package three.renderers import org.w3c.dom.Node diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTarget.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTarget.kt similarity index 93% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTarget.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTarget.kt index 08c44a36..2cbd272b 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTarget.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTarget.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers +package three.renderers -import info.laht.threekt.math.Vector4 -import info.laht.threekt.textures.Texture +import three.math.Vector4 +import three.textures.Texture external class WebGLRenderTarget { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTargetOptions.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTargetOptions.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTargetOptions.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTargetOptions.kt index 4ba8b941..145431ce 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderTargetOptions.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderTargetOptions.kt @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package info.laht.threekt.renderers +package three.renderers data class WebGLRenderTargetOptions( val wrapS: Int? = undefined, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderer.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderer.kt similarity index 96% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderer.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderer.kt index aa95f1ba..45fc212e 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRenderer.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRenderer.kt @@ -25,12 +25,12 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers +package three.renderers -import info.laht.threekt.cameras.Camera -import info.laht.threekt.math.Plane -import info.laht.threekt.scenes.Scene import org.w3c.dom.Node +import three.cameras.Camera +import three.math.Plane +import three.scenes.Scene external class WebGLRenderer(params: WebGLRendererParams = definedExternally) { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRendererParams.kt b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRendererParams.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRendererParams.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/WebGLRendererParams.kt index e6800673..6b979e8f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/WebGLRendererParams.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/WebGLRendererParams.kt @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package info.laht.threekt.renderers +package three.renderers import org.w3c.dom.Node diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderChunk.kt b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderChunk.kt similarity index 99% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderChunk.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderChunk.kt index f70c7137..ccf4d37f 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderChunk.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderChunk.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers.shaders +package three.renderers.shaders external object ShaderChunk { val alphamap_fragment: String diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderLib.kt b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderLib.kt similarity index 96% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderLib.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderLib.kt index f168f740..67ed1215 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/ShaderLib.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/ShaderLib.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers.shaders +package three.renderers.shaders external object ShaderLib { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/UniformsUtil.kt b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/UniformsUtil.kt similarity index 94% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/UniformsUtil.kt rename to visionforge-threejs/src/main/kotlin/three/renderers/shaders/UniformsUtil.kt index fb68d712..3d68f177 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/renderers/shaders/UniformsUtil.kt +++ b/visionforge-threejs/src/main/kotlin/three/renderers/shaders/UniformsUtil.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.renderers.shaders +package three.renderers.shaders -import info.laht.threekt.core.Uniform +import three.core.Uniform external object UniformsUtil { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Fog.kt b/visionforge-threejs/src/main/kotlin/three/scenes/Fog.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Fog.kt rename to visionforge-threejs/src/main/kotlin/three/scenes/Fog.kt index c5682f36..87b67fb0 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Fog.kt +++ b/visionforge-threejs/src/main/kotlin/three/scenes/Fog.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.scenes +package three.scenes -import info.laht.threekt.math.Color +import three.math.Color external class Fog { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/FogExp2.kt b/visionforge-threejs/src/main/kotlin/three/scenes/FogExp2.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/FogExp2.kt rename to visionforge-threejs/src/main/kotlin/three/scenes/FogExp2.kt index 017fd34b..fed2c580 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/FogExp2.kt +++ b/visionforge-threejs/src/main/kotlin/three/scenes/FogExp2.kt @@ -25,9 +25,9 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.scenes +package three.scenes -import info.laht.threekt.math.Color +import three.math.Color external class FogExp2 { diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Scene.kt b/visionforge-threejs/src/main/kotlin/three/scenes/Scene.kt similarity index 95% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Scene.kt rename to visionforge-threejs/src/main/kotlin/three/scenes/Scene.kt index 16e5e3cd..41fc011c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/scenes/Scene.kt +++ b/visionforge-threejs/src/main/kotlin/three/scenes/Scene.kt @@ -25,10 +25,10 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.scenes +package three.scenes -import info.laht.threekt.core.Object3D -import info.laht.threekt.materials.Material +import three.core.Object3D +import three.materials.Material /** * Scenes allow you to set up what and where is to be rendered by three.js. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CompressedTexture.kt b/visionforge-threejs/src/main/kotlin/three/textures/CompressedTexture.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CompressedTexture.kt rename to visionforge-threejs/src/main/kotlin/three/textures/CompressedTexture.kt index 1d25e61d..10b72f45 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CompressedTexture.kt +++ b/visionforge-threejs/src/main/kotlin/three/textures/CompressedTexture.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.textures +package three.textures /** * Creates a texture based on data in compressed form, for example from a DDS file. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CubeTexture.kt b/visionforge-threejs/src/main/kotlin/three/textures/CubeTexture.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CubeTexture.kt rename to visionforge-threejs/src/main/kotlin/three/textures/CubeTexture.kt index b5eb6e89..b386f264 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/CubeTexture.kt +++ b/visionforge-threejs/src/main/kotlin/three/textures/CubeTexture.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.textures +package three.textures import org.w3c.dom.Element diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/DepthTexture.kt b/visionforge-threejs/src/main/kotlin/three/textures/DepthTexture.kt similarity index 97% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/DepthTexture.kt rename to visionforge-threejs/src/main/kotlin/three/textures/DepthTexture.kt index 0ce9a308..eabc7d9c 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/DepthTexture.kt +++ b/visionforge-threejs/src/main/kotlin/three/textures/DepthTexture.kt @@ -25,7 +25,7 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.textures +package three.textures external class DepthTexture( width: Int, diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/Texture.kt b/visionforge-threejs/src/main/kotlin/three/textures/Texture.kt similarity index 98% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/Texture.kt rename to visionforge-threejs/src/main/kotlin/three/textures/Texture.kt index b936c2f5..853ae54e 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/textures/Texture.kt +++ b/visionforge-threejs/src/main/kotlin/three/textures/Texture.kt @@ -25,11 +25,11 @@ @file:JsModule("three") @file:JsNonModule -package info.laht.threekt.textures +package three.textures -import info.laht.threekt.math.Matrix3 -import info.laht.threekt.math.Vector2 import org.w3c.dom.Element +import three.math.Matrix3 +import three.math.Vector2 /** * Create a texture to apply to a surface or as a reflection or refraction map. diff --git a/visionforge-threejs/src/main/kotlin/info/laht/threekt/utils/BufferGeometryUtils.kt b/visionforge-threejs/src/main/kotlin/three/utils/BufferGeometryUtils.kt similarity index 87% rename from visionforge-threejs/src/main/kotlin/info/laht/threekt/utils/BufferGeometryUtils.kt rename to visionforge-threejs/src/main/kotlin/three/utils/BufferGeometryUtils.kt index dd15b514..9c52f8be 100644 --- a/visionforge-threejs/src/main/kotlin/info/laht/threekt/utils/BufferGeometryUtils.kt +++ b/visionforge-threejs/src/main/kotlin/three/utils/BufferGeometryUtils.kt @@ -1,8 +1,8 @@ @file:JsModule("three/examples/jsm/utils/BufferGeometryUtils") @file:JsNonModule -package info.laht.threekt.utils +package three.utils -import info.laht.threekt.core.BufferGeometry +import three.core.BufferGeometry public external object BufferGeometryUtils { -- 2.34.1 From 67afa4e45b5008cdfe4416c35d561d1ae9e8fd7c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 15 Aug 2022 09:47:56 +0300 Subject: [PATCH 092/143] Fix light --- demo/playground/src/jvmMain/kotlin/gdmlCubes.kt | 11 +++++++++-- .../src/main/kotlin/ru/mipt/npm/sat/satServer.kt | 7 ++++++- .../kotlin/space/kscience/visionforge/VisionChange.kt | 11 ++++++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt index d5d483bc..fc134408 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt @@ -1,13 +1,20 @@ package space.kscience.visionforge.examples import space.kscience.gdml.GdmlShowCase +import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.set -fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { vision("canvas") { requirePlugin(Solids) - GdmlShowCase.cubes().toVision() + GdmlShowCase.cubes().toVision().also { + it.ambientLight { + color.set(Colors.white) + } + } } } \ No newline at end of file diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 41ac4d2f..e7326982 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -8,6 +8,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Colors import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.plus import space.kscience.visionforge.server.close @@ -28,7 +29,11 @@ fun main() { val solids = satContext.fetch(Solids) //Create a geometry - val sat = solids.visionOfSatellite(ySegments = 3) + val sat = solids.visionOfSatellite(ySegments = 3).apply { + ambientLight { + color.set(Colors.white) + } + } val server = satContext.visionManager.serve { page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 1edcdf70..0001dd44 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -9,6 +9,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.plus import kotlin.jvm.Synchronized import kotlin.time.Duration @@ -17,7 +18,7 @@ import kotlin.time.Duration * Create a deep copy of given Vision without external connections. */ private fun Vision.deepCopy(manager: VisionManager): Vision { - if(this is NullVision) return NullVision + if (this is NullVision) return NullVision //Assuming that unrooted visions are already isolated //TODO replace by efficient deep copy @@ -49,7 +50,7 @@ public object NullVision : Vision { public class VisionChangeBuilder(private val manager: VisionManager) : MutableVisionContainer { private var vision: Vision? = null - private val propertyChange = MutableMeta() + private var propertyChange = MutableMeta() private val children: HashMap = HashMap() public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() @@ -61,7 +62,11 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi public fun propertyChanged(visionName: Name, propertyName: Name, item: Meta?) { if (visionName == Name.EMPTY) { //Write property removal as [Null] - propertyChange[propertyName] = (item ?: Meta(Null)) + if (propertyName.isEmpty()) { + propertyChange = item?.toMutableMeta() ?: MutableMeta() + } else { + propertyChange[propertyName] = (item ?: Meta(Null)) + } } else { getOrPutChild(visionName).propertyChanged(Name.EMPTY, propertyName, item) } -- 2.34.1 From 40b784f55143ab8f31f887eac0c3ae58dad90cc3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 19 Aug 2022 11:22:10 +0300 Subject: [PATCH 093/143] More universal treatment of highlighting in three --- .../space/kscience/visionforge/StyleSheet.kt | 2 +- .../kscience/visionforge/VisionProperties.kt | 5 +- .../space/kscience/visionforge/solid/Solid.kt | 2 + .../visionforge/solid/three/ThreeCanvas.kt | 34 +++++++++--- .../solid/three/ThreeLabelFactory.kt | 8 +-- .../visionforge/solid/three/ThreeMaterials.kt | 52 +++++++++++++------ .../solid/three/ThreeMeshFactory.kt | 2 +- .../main/kotlin/three/meshline/meshLineExt.kt | 5 +- 8 files changed, 79 insertions(+), 31 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 9db79e19..7320839d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -67,7 +67,7 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = properties.getValue(Vision.STYLE_KEY, inherit = false, includeStyles = false)?.stringList ?: emptyList() + get() = properties.own?.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList() set(value) { properties.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index fd7befdf..3a80dcf2 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -143,8 +143,11 @@ private class VisionPropertiesItem( override fun hashCode(): Int = Meta.hashCode(this) } +/** + * A base implementation of [MutableVisionProperties] + */ public abstract class AbstractVisionProperties( - private val vision: Vision, + public val vision: Vision, ) : MutableVisionProperties { override val descriptor: MetaDescriptor? get() = vision.descriptor diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 7d0d0b94..5585a970 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -58,6 +58,8 @@ public interface Solid : Vision { public val ROTATION_KEY: Name = "rotation".asName() + public val QUATERNION_KEY: Name = "quaternion".asName() + public val X_ROTATION_KEY: Name = ROTATION_KEY + X_KEY public val Y_ROTATION_KEY: Name = ROTATION_KEY + Y_KEY public val Z_ROTATION_KEY: Name = ROTATION_KEY + Z_KEY diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 04b04699..4e6935a8 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -20,9 +20,12 @@ import three.external.controls.OrbitControls import three.external.controls.TrackballControls import three.geometries.EdgesGeometry import three.helpers.AxesHelper +import three.materials.Material import three.math.* import three.meshline.MeshLine import three.meshline.MeshLineMaterial +import three.meshline.isMeshLineMaterial +import three.objects.LineSegments import three.objects.Mesh import three.scenes.Scene import kotlin.math.cos @@ -276,7 +279,7 @@ public class ThreeCanvas( private fun Object3D.toggleHighlight( highlight: Boolean, edgesName: String, - material: MeshLineMaterial, + material: Material, ) { if (userData[DO_NOT_HIGHLIGHT_TAG] == true) { @@ -284,16 +287,21 @@ public class ThreeCanvas( } if (isMesh(this)) { - val highlightMesh = getObjectByName(edgesName) ?: Mesh( - MeshLine(EdgesGeometry(geometry)), - material - ).also { + val highlightMesh = getObjectByName(edgesName) ?: if (isMeshLineMaterial(material)) { + Mesh( + MeshLine(EdgesGeometry(geometry)), + material + ) + } else { + LineSegments(EdgesGeometry(geometry), material) + }.also { it.name = edgesName add(it) } highlightMesh.visible = highlight } else { - children.filter { !it.name.startsWith("@") && it.name != edgesName }.forEach { + //ignore service objects if they are not statics + children.filter { it.name.startsWith("@static") || !it.name.startsWith("@") }.forEach { it.toggleHighlight(highlight, edgesName, material) } } @@ -319,15 +327,25 @@ public class ThreeCanvas( public companion object { public val SELECTED_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { color.set(Colors.ivory) - linewidth = 2.0 + thickness = 2f cached = true } public val HIGHLIGHT_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { color.set(Colors.blue) - linewidth = 2.0 + thickness = 2f cached = true } +// +// public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { +// color.set(Colors.ivory) +// cached = true +// } +// +// public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply { +// color.set(Colors.blue) +// cached = true +// } public const val DO_NOT_HIGHLIGHT_TAG: String = "doNotHighlight" diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 49796fb0..2bd8c572 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -1,14 +1,14 @@ package space.kscience.visionforge.solid.three -import three.core.Object3D -import three.geometries.TextBufferGeometry -import three.objects.Mesh import kotlinx.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.SolidLabel +import three.core.Object3D +import three.geometries.TextBufferGeometry +import three.objects.Mesh import kotlin.reflect.KClass /** @@ -25,7 +25,7 @@ public object ThreeLabelFactory : ThreeFactory { curveSegments = 1 }) return Mesh(textGeo, ThreeMaterials.DEFAULT).apply { - createMaterial(vision) + setMaterial(vision) updatePosition(vision) if(observe) { vision.onPropertyChange(three.context) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index abcd5df5..5966ee30 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -60,6 +60,7 @@ public object ThreeMaterials { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false } + else -> MeshStandardMaterial().apply { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR emissive = meta[SolidMaterial.EMISSIVE_COLOR_KEY]?.threeColor() ?: DEFAULT_EMISSIVE_COLOR @@ -71,10 +72,18 @@ public object ThreeMaterials { needsUpdate = true } - private val materialCache = HashMap() +// private val materialCache = HashMap() +// +// internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta.hashCode()) { +// buildMaterial(meta).apply { +// cached = true +// } +// } - internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta.hashCode()) { - buildMaterial(meta).apply { + private val visionMaterialCache = HashMap() + + internal fun cacheMaterial(vision: Vision): Material = visionMaterialCache.getOrPut(vision) { + buildMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)).apply { cached = true } } @@ -84,7 +93,7 @@ public object ThreeMaterials { * Compute color */ public fun Meta.threeColor(): Color? { - if(isEmpty()) return null + if (isEmpty()) return null val value = value return if (isLeaf) { when { @@ -118,13 +127,19 @@ internal var Material.cached: Boolean userData["cached"] = value } -public fun Mesh.createMaterial(vision: Vision) { - val ownMaterialMeta = vision.properties.own?.get(SolidMaterial.MATERIAL_KEY) - if (ownMaterialMeta == null) { - if (vision is SolidReference && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty()) { - createMaterial(vision.prototype) +public fun Mesh.setMaterial(vision: Vision) { + if ( + vision.properties.own?.get(SolidMaterial.MATERIAL_KEY) == null + && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty() + ) { + //if this is a reference, use material of the prototype + if (vision is SolidReference) { + ThreeMaterials.cacheMaterial(vision.prototype) } else { - material = ThreeMaterials.cacheMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)) + material = vision.parent?.let { parent -> + //TODO cache parent material + ThreeMaterials.buildMaterial(parent.properties.getProperty(SolidMaterial.MATERIAL_KEY)) + } ?: ThreeMaterials.cacheMaterial(vision) } } else { material = ThreeMaterials.buildMaterial(vision.properties.getProperty(SolidMaterial.MATERIAL_KEY)) @@ -138,22 +153,27 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { || propertyName == SolidMaterial.MATERIAL_KEY + SolidMaterial.TYPE_KEY ) { //generate a new material since cached material should not be changed - createMaterial(vision) + setMaterial(vision) } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { - material.asDynamic().color = vision.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).threeColor() - ?: ThreeMaterials.DEFAULT_COLOR + material.asDynamic().color = + vision.properties.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).threeColor() + ?: ThreeMaterials.DEFAULT_COLOR } + SolidMaterial.SPECULAR_COLOR_KEY -> { - material.asDynamic().specular = vision.properties.getProperty(SolidMaterial.SPECULAR_COLOR_KEY).threeColor() - ?: ThreeMaterials.DEFAULT_COLOR + material.asDynamic().specular = + vision.properties.getProperty(SolidMaterial.SPECULAR_COLOR_KEY).threeColor() + ?: ThreeMaterials.DEFAULT_COLOR } + SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { material.asDynamic().emissive = vision.properties.getProperty(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY) .threeColor() ?: ThreeMaterials.BLACK_COLOR } + SolidMaterial.MATERIAL_OPACITY_KEY -> { val opacity = vision.properties.getValue( SolidMaterial.MATERIAL_OPACITY_KEY, @@ -162,12 +182,14 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { material.opacity = opacity material.transparent = opacity < 1.0 } + SolidMaterial.MATERIAL_WIREFRAME_KEY -> { material.asDynamic().wireframe = vision.properties.getValue( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, )?.boolean ?: false } + else -> console.warn("Unrecognized material property: $propertyName") } material.needsUpdate = true diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index ef7f5120..b27bdcab 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -85,7 +85,7 @@ public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit } internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { - createMaterial(vision) + setMaterial(vision) applyEdges(vision) //applyWireFrame(obj) layers.set(vision.layer) diff --git a/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt b/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt index a2bfa57a..60047884 100644 --- a/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt +++ b/visionforge-threejs/src/main/kotlin/three/meshline/meshLineExt.kt @@ -1,8 +1,11 @@ package three.meshline import three.core.BufferGeometry +import three.materials.Material import three.math.Vector3 public fun MeshLine(geometry: BufferGeometry): MeshLine = MeshLine().apply { setGeometry(geometry) } -public fun MeshLine(points: Array): MeshLine = MeshLine().apply { setPoints(points) } \ No newline at end of file +public fun MeshLine(points: Array): MeshLine = MeshLine().apply { setPoints(points) } + +internal fun isMeshLineMaterial(material: Material): Boolean = material.asDynamic().isMeshLineMaterial == true \ No newline at end of file -- 2.34.1 From 75540a078f70d5e5d4b7d3811791994c4bd6ffe7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 21 Aug 2022 17:21:36 +0300 Subject: [PATCH 094/143] Add quaternion support --- .../visionforge/html/HtmlVisionContext.kt | 8 ++++---- .../kscience/visionforge/solid/FX3DPlugin.kt | 2 ++ .../space/kscience/visionforge/solid/Solid.kt | 20 +++++++++++++++++++ .../solid/transform/RemoveSingleChild.kt | 1 + .../visionforge/solid/three/ThreeFactory.kt | 15 +++++++++++++- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt index 513676d4..007658b1 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt @@ -34,11 +34,11 @@ public interface HtmlVisionContext : ContextAware { public typealias HtmlVisionContextFragment = context(HtmlVisionContext) TagConsumer<*>.() -> Unit -context(HtmlVisionContext) - public fun HtmlVisionContextFragment(content: TagConsumer<*>.() -> Unit): HtmlVisionFragment = content +context(HtmlVisionContext) public fun HtmlVisionFragment( + content: TagConsumer<*>.() -> Unit +): HtmlVisionFragment = content -context(HtmlVisionContext) - private fun TagConsumer.vision( +context(HtmlVisionContext) private fun TagConsumer.vision( visionManager: VisionManager, name: Name, vision: Vision, diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 8a0abcdb..990b0b54 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -97,6 +97,8 @@ public class FX3DPlugin : AbstractPlugin() { scaleYProperty().bind(binding[Solid.Y_SCALE_KEY].float(obj.scaleY.toFloat())) scaleZProperty().bind(binding[Solid.Z_SCALE_KEY].float(obj.scaleZ.toFloat())) + if(obj.quaternion!= null) TODO("Quaternion support not implemented") + val rotateX = Rotate(0.0, Rotate.X_AXIS).apply { angleProperty().bind(binding[Solid.X_ROTATION_KEY].float(obj.rotationX.toFloat()).multiply(180.0 / PI)) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 5585a970..b87f0c93 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -203,6 +203,26 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f) public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f) public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) +public var Solid.quaternion: Pair? + get() = properties.getValue(Solid.QUATERNION_KEY)?.list?.let { + require(it.size == 4) { "Quaternion must be a number array of 4 elements" } + it[0].float to Point3D(it[1].float, it[2].float, it[3].float) + } + set(value) { + properties.setValue( + Solid.QUATERNION_KEY, + value?.let { + ListValue( + value.first, + value.second.x, + value.second.y, + value.second.z + ) + } + ) + } + + //public var Solid.quaternion: Quaternion? // get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) } // set(value) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index d1e6fe5a..6a309d94 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -14,6 +14,7 @@ internal fun Solid.updateFrom(other: Solid): Solid { x += other.x y += other.y z += other.y + if(quaternion != null || other.quaternion != null) TODO("Quaternion support not implemented") rotationX += other.rotationX rotationY += other.rotationY rotationZ += other.rotationZ diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index cf42c139..a0852c72 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -11,6 +11,7 @@ import space.kscience.visionforge.visible import three.core.BufferGeometry import three.core.Object3D import three.math.Euler +import three.math.Quaternion import kotlin.reflect.KClass /** @@ -48,8 +49,20 @@ public fun Object3D.updatePosition(vision: Vision) { // } else { // setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) // } + val quaternion = vision.quaternion - setRotationFromEuler(Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name)) + if (quaternion != null) { + setRotationFromQuaternion( + Quaternion( + quaternion.second.x, + quaternion.second.y, + quaternion.second.z, + quaternion.first + ) + ) + } else { + setRotationFromEuler(Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name)) + } scale.set(vision.scaleX, vision.scaleY, vision.scaleZ) updateMatrix() -- 2.34.1 From 25fc143363f9cc37779d6df5fae1be14b00b47a4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 23 Aug 2022 12:06:27 +0300 Subject: [PATCH 095/143] Performance optimization --- build.gradle.kts | 3 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 1 - .../ru/mipt/npm/muon/monitor/Monitor.kt | 85 +++++++++++-------- .../kscience/visionforge/VisionProperties.kt | 4 +- .../solid/three/ThreeCanvasLabelFactory.kt | 22 +++-- .../visionforge/solid/three/ThreeMaterials.kt | 17 ++-- .../solid/three/ThreeReferenceFactory.kt | 23 ++--- 7 files changed, 85 insertions(+), 70 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4c76b98f..939d197b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.6.0-dev-13") +val dataforgeVersion by extra("0.6.0-dev-15") val fxVersion by extra("11") allprojects{ @@ -15,6 +15,7 @@ subprojects { if (name.startsWith("visionforge")) apply() repositories { + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() maven("https://maven.jzy3d.org/releases") diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index cf8caf80..1b8eb566 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -82,7 +82,6 @@ class Model(val manager: VisionManager) { } event.track?.let { tracks.polyline(*it.toTypedArray(), name = "track[${event.id}]") { - thickness = 4 color.set("red") } } diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt index 3e1db5bc..1a8c8aa9 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt @@ -11,12 +11,12 @@ import space.kscience.visionforge.solid.plus class SC1( val name: String, val center: Point3D, - val xSize: Float = PIXEL_XY_SIZE, val ySize: Float = PIXEL_XY_SIZE, val zSize: Float = PIXEL_Z_SIZE + val xSize: Float = PIXEL_XY_SIZE, val ySize: Float = PIXEL_XY_SIZE, val zSize: Float = PIXEL_Z_SIZE, ) class SC16( val name: String, - val center: Point3D + val center: Point3D, ) { /** @@ -28,73 +28,86 @@ class SC16( val y: Double when (index) { 7 -> { - x = 1.5 * Monitor.PIXEL_XY_SPACING; - y = 1.5 * Monitor.PIXEL_XY_SPACING; + x = 1.5 * Monitor.PIXEL_XY_SPACING + y = 1.5 * Monitor.PIXEL_XY_SPACING } + 4 -> { - x = 0.5 * Monitor.PIXEL_XY_SPACING; - y = 1.5 * Monitor.PIXEL_XY_SPACING; + x = 0.5 * Monitor.PIXEL_XY_SPACING + y = 1.5 * Monitor.PIXEL_XY_SPACING } + 6 -> { - x = 1.5 * Monitor.PIXEL_XY_SPACING; - y = 0.5 * Monitor.PIXEL_XY_SPACING; + x = 1.5 * Monitor.PIXEL_XY_SPACING + y = 0.5 * Monitor.PIXEL_XY_SPACING } + 5 -> { - x = 0.5 * Monitor.PIXEL_XY_SPACING; - y = 0.5 * Monitor.PIXEL_XY_SPACING; + x = 0.5 * Monitor.PIXEL_XY_SPACING + y = 0.5 * Monitor.PIXEL_XY_SPACING } 3 -> { - x = -1.5 * Monitor.PIXEL_XY_SPACING; - y = 1.5 * Monitor.PIXEL_XY_SPACING; + x = -1.5 * Monitor.PIXEL_XY_SPACING + y = 1.5 * Monitor.PIXEL_XY_SPACING } + 0 -> { - x = -0.5 * Monitor.PIXEL_XY_SPACING; - y = 1.5 * Monitor.PIXEL_XY_SPACING; + x = -0.5 * Monitor.PIXEL_XY_SPACING + y = 1.5 * Monitor.PIXEL_XY_SPACING } + 2 -> { - x = -1.5 * Monitor.PIXEL_XY_SPACING; - y = 0.5 * Monitor.PIXEL_XY_SPACING; + x = -1.5 * Monitor.PIXEL_XY_SPACING + y = 0.5 * Monitor.PIXEL_XY_SPACING } + 1 -> { - x = -0.5 * Monitor.PIXEL_XY_SPACING; - y = 0.5 * Monitor.PIXEL_XY_SPACING; + x = -0.5 * Monitor.PIXEL_XY_SPACING + y = 0.5 * Monitor.PIXEL_XY_SPACING } 11 -> { - x = -1.5 * Monitor.PIXEL_XY_SPACING; - y = -1.5 * Monitor.PIXEL_XY_SPACING; + x = -1.5 * Monitor.PIXEL_XY_SPACING + y = -1.5 * Monitor.PIXEL_XY_SPACING } + 8 -> { - x = -0.5 * Monitor.PIXEL_XY_SPACING; - y = -1.5 * Monitor.PIXEL_XY_SPACING; + x = -0.5 * Monitor.PIXEL_XY_SPACING + y = -1.5 * Monitor.PIXEL_XY_SPACING } + 10 -> { - x = -1.5 * Monitor.PIXEL_XY_SPACING; - y = -0.5 * Monitor.PIXEL_XY_SPACING; + x = -1.5 * Monitor.PIXEL_XY_SPACING + y = -0.5 * Monitor.PIXEL_XY_SPACING } + 9 -> { - x = -0.5 * Monitor.PIXEL_XY_SPACING; - y = -0.5 * Monitor.PIXEL_XY_SPACING; + x = -0.5 * Monitor.PIXEL_XY_SPACING + y = -0.5 * Monitor.PIXEL_XY_SPACING } 15 -> { - x = 1.5 * Monitor.PIXEL_XY_SPACING; - y = -1.5 * Monitor.PIXEL_XY_SPACING; + x = 1.5 * Monitor.PIXEL_XY_SPACING + y = -1.5 * Monitor.PIXEL_XY_SPACING } + 12 -> { - x = 0.5 * Monitor.PIXEL_XY_SPACING; - y = -1.5 * Monitor.PIXEL_XY_SPACING; + x = 0.5 * Monitor.PIXEL_XY_SPACING + y = -1.5 * Monitor.PIXEL_XY_SPACING } + 14 -> { - x = 1.5 * Monitor.PIXEL_XY_SPACING; - y = -0.5 * Monitor.PIXEL_XY_SPACING; + x = 1.5 * Monitor.PIXEL_XY_SPACING + y = -0.5 * Monitor.PIXEL_XY_SPACING } + 13 -> { - x = 0.5 * Monitor.PIXEL_XY_SPACING; - y = -0.5 * Monitor.PIXEL_XY_SPACING; + x = 0.5 * Monitor.PIXEL_XY_SPACING + y = -0.5 * Monitor.PIXEL_XY_SPACING } - else -> throw Error(); + + else -> throw Error() } val offset = Point3D(-y, x, 0)//rotateDetector(Point3D(x, y, 0.0)); val pixelName = "${name}_${index}" @@ -137,7 +150,7 @@ object Monitor { .mapNotNull { line -> if (line.startsWith(" ")) { val split = line.trim().split("\\s+".toRegex()) - val detectorName = split[1]; + val detectorName = split[1] val x = split[4].toDouble() - 500 val y = split[5].toDouble() - 500 val z = 180 - split[6].toDouble() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 3a80dcf2..cddb6585 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -165,6 +165,8 @@ public abstract class AbstractVisionProperties( return properties!! } + private val descriptorCache = HashMap() + override fun getValue( name: Name, inherit: Boolean?, @@ -172,7 +174,7 @@ public abstract class AbstractVisionProperties( ): Value? { own?.get(name)?.value?.let { return it } - val descriptor = descriptor?.get(name) + val descriptor = descriptor?.let { descriptor -> descriptorCache.getOrPut(name) { descriptor[name] } } val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true if (stylesFlag) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 0b0019df..7a0f1c7b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -24,15 +24,19 @@ public object ThreeCanvasLabelFactory : ThreeFactory { override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { val canvas = document.createElement("canvas") as HTMLCanvasElement - val context = canvas.getContext("2d") as CanvasRenderingContext2D - context.font = "Bold ${vision.fontSize}pt ${vision.fontFamily}" - context.fillStyle = vision.properties.getValue(SolidMaterial.MATERIAL_COLOR_KEY, false, true)?.value ?: "black" - context.textBaseline = CanvasTextBaseline.MIDDLE - val metrics = context.measureText(vision.text) - //canvas.width = metrics.width.toInt() - - - context.fillText(vision.text, (canvas.width - metrics.width) / 2, 0.5 * canvas.height) + canvas.getContext("2d").apply { + this as CanvasRenderingContext2D + font = "Bold ${vision.fontSize}pt ${vision.fontFamily}" + fillStyle = vision.properties.getValue( + SolidMaterial.MATERIAL_COLOR_KEY, + inherit = false, + includeStyles = true + )?.value ?: "black" + textBaseline = CanvasTextBaseline.MIDDLE + val metrics = measureText(vision.text) + //canvas.width = metrics.width.toInt() + fillText(vision.text, (canvas.width - metrics.width) / 2, 0.5 * canvas.height) + } // canvas contents will be used for a texture diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 5966ee30..f5ac5c2b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -93,22 +93,17 @@ public object ThreeMaterials { * Compute color */ public fun Meta.threeColor(): Color? { - if (isEmpty()) return null - val value = value - return if (isLeaf) { - when { - value == null -> null + value?.let { value -> + return when { value === Null -> null value.type == ValueType.NUMBER -> Color(value.int) else -> Color(value.string) } - } else { - Color( - getValue(Colors.RED_KEY.asName())?.int ?: 0, - getValue(Colors.GREEN_KEY.asName())?.int ?: 0, - getValue(Colors.BLUE_KEY.asName())?.int ?: 0 - ) } + val red = getValue(Colors.RED_KEY.asName())?.int + val green = getValue(Colors.GREEN_KEY.asName())?.int + val blue = getValue(Colors.BLUE_KEY.asName())?.int + return if (red == null && green == null && blue == null) null else Color(red ?: 0, green ?: 0, blue ?: 0) } public fun ColorAccessor.threeColor(): Color? { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index bde8c456..405956f8 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -16,17 +16,18 @@ public object ThreeReferenceFactory : ThreeFactory { override val type: KClass = SolidReference::class - private fun Object3D.replicate(): Object3D { - return when { - isMesh(this) -> Mesh(geometry, material).also { - it.applyMatrix4(matrix) - } - else -> clone(false) - }.also { obj: Object3D -> - obj.name = this.name - children.forEach { child: Object3D -> - obj.add(child.replicate()) - } + private fun Object3D.replicate(): Object3D = when { + isMesh(this) -> Mesh(geometry, material).also { + //clone geometry + it.material.cached = true + it.applyMatrix4(matrix) + } + + else -> clone(false) + }.also { obj: Object3D -> + obj.name = this.name + children.forEach { child: Object3D -> + obj.add(child.replicate()) } } -- 2.34.1 From 56d577453a8cc52d0cf07f343445ea4ddfe48720 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Aug 2022 09:19:13 +0300 Subject: [PATCH 096/143] Fix edges for composite --- CHANGELOG.md | 1 + .../visionforge/solid/demo/VariableBox.kt | 3 +- .../visionforge/solid/SolidMaterial.kt | 14 ++++++++- .../solid/three/ThreeCompositeFactory.kt | 12 ++++---- .../solid/three/ThreeMeshFactory.kt | 29 +++++-------------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f60db403..2b7d7766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - MeshLine for thick lines ### Changed +- Edges moved to solids module for easier construction - Visions **must** be rooted in order to subscribe to updates. - Visions use flows instead of direct subscriptions. - Radical change of inner workings of vision children and properties. diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 1e626155..15e53129 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -8,6 +8,7 @@ import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.setChild import space.kscience.visionforge.solid.SolidGroup +import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_KEY import space.kscience.visionforge.solid.layer import space.kscience.visionforge.solid.three.* import three.core.Object3D @@ -60,7 +61,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision mesh.updateMatrix() } - name.startsWith(ThreeMeshFactory.EDGES_KEY) -> mesh.applyEdges(this@VariableBox) + name.startsWith(EDGES_KEY) -> mesh.applyEdges(this@VariableBox) else -> mesh.updateProperty(this@VariableBox, name) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 7d5c4d00..df720e6c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -52,6 +52,11 @@ public class SolidMaterial : Scheme() { public val MATERIAL_SPECULAR_COLOR_KEY: Name = MATERIAL_KEY + SPECULAR_COLOR_KEY public val MATERIAL_WIREFRAME_KEY: Name = MATERIAL_KEY + WIREFRAME_KEY + public val EDGES_KEY: Name = "edges".asName() + public val ENABLED_KEY: Name = "enabled".asName() + public val EDGES_ENABLED_KEY: Name = EDGES_KEY + ENABLED_KEY + public val EDGES_MATERIAL_KEY: Name = EDGES_KEY + MATERIAL_KEY + public override val descriptor: MetaDescriptor by lazy { //must be lazy to avoid initialization bug MetaDescriptor { @@ -114,4 +119,11 @@ public var Solid.opacity: Number? get() = properties.getValue(MATERIAL_OPACITY_KEY, inherit = true)?.number set(value) { properties.setValue(MATERIAL_OPACITY_KEY, value?.asValue()) - } \ No newline at end of file + } + + +@VisionBuilder +public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { + properties[SolidMaterial.EDGES_ENABLED_KEY] = enabled + SolidMaterial.write(properties.getProperty(SolidMaterial.EDGES_MATERIAL_KEY)).apply(block) +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 44bcb797..fe40022d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -5,6 +5,7 @@ import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Composite import space.kscience.visionforge.solid.CompositeType +import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_KEY import three.objects.Mesh import kotlin.reflect.KClass @@ -38,10 +39,10 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class override fun build(three: ThreePlugin, vision: Composite, observe: Boolean): Mesh { - val first = - three.buildObject3D(vision.first, observe).takeIfMesh() ?: error("First part of composite is not a mesh") - val second = - three.buildObject3D(vision.second, observe).takeIfMesh() ?: error("Second part of composite is not a mesh") + val first = three.buildObject3D(vision.first, observe).takeIfMesh() + ?: error("First part of composite is not a mesh") + val second = three.buildObject3D(vision.second, observe).takeIfMesh() + ?: error("Second part of composite is not a mesh") return when (vision.compositeType) { CompositeType.GROUP, CompositeType.UNION -> CSG.union(first, second) CompositeType.INTERSECT -> CSG.intersect(first, second) @@ -49,11 +50,12 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory }.apply { updatePosition(vision) applyProperties(vision) + if (observe) { vision.onPropertyChange { name -> when { //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) - name.startsWith(ThreeMeshFactory.EDGES_KEY) -> applyEdges(vision) + name.startsWith(EDGES_KEY) -> applyEdges(vision) else -> updateProperty(vision, name) } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index b27bdcab..b3281e4b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -1,18 +1,13 @@ package space.kscience.visionforge.solid.three import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith -import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.set import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidMaterial +import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_ENABLED_KEY +import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_KEY +import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_MATERIAL_KEY import space.kscience.visionforge.solid.layer -import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY -import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_OBJECT_NAME import three.core.BufferGeometry import three.geometries.EdgesGeometry @@ -43,7 +38,7 @@ public abstract class ThreeMeshFactory( applyProperties(vision) } - if(observe) { + if (observe) { //add listener to object properties vision.onPropertyChange(three.context) { name -> when { @@ -66,24 +61,15 @@ public abstract class ThreeMeshFactory( } public companion object { - public val EDGES_KEY: Name = "edges".asName() internal const val EDGES_OBJECT_NAME: String = "@edges" //public val WIREFRAME_KEY: Name = "wireframe".asName() - public val ENABLED_KEY: Name = "enabled".asName() - public val EDGES_ENABLED_KEY: Name = EDGES_KEY + ENABLED_KEY - public val EDGES_MATERIAL_KEY: Name = EDGES_KEY + SolidMaterial.MATERIAL_KEY + //public val WIREFRAME_ENABLED_KEY: Name = WIREFRAME_KEY + ENABLED_KEY //public val WIREFRAME_MATERIAL_KEY: Name = WIREFRAME_KEY + SolidMaterial.MATERIAL_KEY } } -@VisionBuilder -public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { - properties[EDGES_ENABLED_KEY] = enabled - SolidMaterial.write(properties.getProperty(EDGES_MATERIAL_KEY)).apply(block) -} - internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { setMaterial(vision) applyEdges(vision) @@ -97,13 +83,12 @@ internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { public fun Mesh.applyEdges(vision: Solid) { val edges = children.find { it.name == EDGES_OBJECT_NAME } as? LineSegments //inherited edges definition, enabled by default - if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) { - val bufferGeometry = geometry as? BufferGeometry ?: return + if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = false)?.boolean != false) { val material = ThreeMaterials.getLineMaterial(vision.properties.getProperty(EDGES_MATERIAL_KEY), true) if (edges == null) { add( LineSegments( - EdgesGeometry(bufferGeometry), + EdgesGeometry(geometry), material ).apply { name = EDGES_OBJECT_NAME -- 2.34.1 From f0a6e12358f15f49f91a1054785d6a091221a869 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Aug 2022 09:59:10 +0300 Subject: [PATCH 097/143] Fix light for GDML and ambient lighg updates --- .../src/jvmMain/kotlin/gdmlCubes.kt | 9 +--- .../src/jvmMain/kotlin/gdmlCurve.kt | 2 +- .../visionforge/gdml/GdmlLoaderOptions.kt | 8 +-- .../kscience/visionforge/gdml/gdmlLoader.kt | 49 ++++++++++++------- .../visionforge/solid/ColorAccessor.kt | 6 ++- .../kscience/visionforge/solid/LightSource.kt | 16 +++--- .../solid/three/ThreeAmbientLightFactory.kt | 16 ++++++ .../solid/three/ThreeMeshFactory.kt | 32 +----------- 8 files changed, 66 insertions(+), 72 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt index fc134408..3e5b0475 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt @@ -1,20 +1,13 @@ package space.kscience.visionforge.examples import space.kscience.gdml.GdmlShowCase -import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.set fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { vision("canvas") { requirePlugin(Solids) - GdmlShowCase.cubes().toVision().also { - it.ambientLight { - color.set(Colors.white) - } - } + GdmlShowCase.cubes().toVision() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index f98a0b81..c2af2a8f 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -223,7 +223,7 @@ fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceL } } }.toVision { - configure { _, solid, _ -> + solids { _, solid, _ -> //disable visibility for the world box if(solid.name == "world"){ visible = false diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt index 34ab7d68..56158c55 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt @@ -4,9 +4,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.names.Name import space.kscience.gdml.* -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidMaterial -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.* import space.kscience.visionforge.useStyle import kotlin.random.Random @@ -70,7 +68,7 @@ public class GdmlLoaderOptions { } private set - public fun configure(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { + public fun solids(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { val oldConfigure = configureSolid configureSolid = { parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial -> oldConfigure(parent, solid, material) @@ -79,6 +77,8 @@ public class GdmlLoaderOptions { } + public var light: LightSource? = AmbientLightSource() + public companion object { private val random: Random = Random(222) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 18e2640e..58213437 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -27,10 +27,10 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { /** * A special group for local templates */ - private val proto = SolidGroup() + private val templates = SolidGroup() - private val solids = proto.solidGroup(solidsName) { - properties["edges.enabled"] = false + private val solids = templates.solidGroup(solidsName) { + edges(false) } private val referenceStore = HashMap>() @@ -46,7 +46,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { private fun proxySolid(root: Gdml, group: SolidGroup, solid: GdmlSolid, name: String): SolidReference { val templateName = solidsName + name - if (proto[templateName] == null) { + if (templates[templateName] == null) { solids.addSolid(root, solid, name) } val ref = group.ref(templateName, name) @@ -61,8 +61,8 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { volume: GdmlGroup, ): SolidReference { val templateName = volumesName + volume.name.asName() - if (proto[templateName] == null) { - proto.setChild(templateName, volume(root, volume)) + if (templates[templateName] == null) { + templates.setChild(templateName, volume(root, volume)) } val ref = group.ref(templateName, physVolume.name).withPosition(root, physVolume) referenceStore.getOrPut(templateName) { ArrayList() }.add(ref) @@ -139,6 +139,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { angle = solid.deltaphi * aScale, name = name ) + is GdmlCone -> if (solid.rmin1.toDouble() == 0.0 && solid.rmin2.toDouble() == 0.0) { cone( bottomRadius = solid.rmax1 * lScale, @@ -160,6 +161,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { name = name ) } + is GdmlXtru -> extruded(name) { shape { solid.vertices.forEach { @@ -175,6 +177,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { ) } } + is GdmlScaledSolid -> { //Add solid with modified scale val innerSolid: GdmlSolid = solid.solidref.resolve(root) @@ -186,6 +189,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { scaleZ = solid.scale.z.toFloat() } } + is GdmlSphere -> sphereLayer( outerRadius = solid.rmax * lScale, innerRadius = solid.rmin * lScale, @@ -195,6 +199,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { thetaStart = solid.starttheta * aScale, name = name, ) + is GdmlOrb -> sphere(solid.r * lScale, name = name) is GdmlPolyhedra -> extruded(name) { //getting the radius of first @@ -211,6 +216,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { layer(plane.z * lScale, scale = plane.rmax * lScale / baseRadius) } } + is GdmlBoolSolid -> { val first: GdmlSolid = solid.first.resolve(root) ?: error("") val second: GdmlSolid = solid.second.resolve(root) ?: error("") @@ -235,6 +241,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { } } + is GdmlTrapezoid -> { val dxBottom = solid.x1.toDouble() / 2 val dxTop = solid.x2.toDouble() / 2 @@ -251,6 +258,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val node8 = Point3D(-dxTop, dyTop, dz) hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) } + is GdmlEllipsoid -> TODO("Renderer for $solid not supported yet") is GdmlElTube -> TODO("Renderer for $solid not supported yet") is GdmlElCone -> TODO("Renderer for $solid not supported yet") @@ -271,9 +279,11 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { GdmlLoaderOptions.Action.ADD -> { addSolid(root, solid, name) } + GdmlLoaderOptions.Action.PROTOTYPE -> { proxySolid(root, this, solid, name ?: solid.name) } + GdmlLoaderOptions.Action.REJECT -> { //ignore null @@ -304,9 +314,11 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val group: SolidGroup = volume(root, volume) this.setChild(physVolume.name, group.withPosition(root, physVolume)) } + GdmlLoaderOptions.Action.PROTOTYPE -> { proxyVolume(root, this, physVolume, volume) } + GdmlLoaderOptions.Action.REJECT -> { //ignore } @@ -348,35 +360,36 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { } } - private fun finalize(final: SolidGroup): SolidGroup { - val rootStyle by final.style("gdml") { + fun transform(root: Gdml): SolidGroup { + val rootSolid = volume(root, root.world.resolve(root) ?: error("GDML root is not resolved")) + + val rootStyle by rootSolid.style("gdml") { Solid.ROTATION_ORDER_KEY put RotationOrder.ZXY } - final.useStyle(rootStyle, false) - final.prototypes { - proto.items.forEach { (token, item) -> + rootSolid.useStyle(rootStyle, false) + + rootSolid.prototypes { + templates.items.forEach { (token, item) -> item.parent = null setChild(token.asName(), item as? Solid) } } settings.styleCache.forEach { - final.styleSheet { + rootSolid.styleSheet { define(it.key.toString(), it.value) } } - return final + return rootSolid } - - fun transform(root: Gdml): SolidGroup = - finalize(volume(root, root.world.resolve(root) ?: error("GDML root is not resolved"))) } public fun Gdml.toVision(block: GdmlLoaderOptions.() -> Unit = {}): SolidGroup { val settings = GdmlLoaderOptions().apply(block) - val context = GdmlLoader(settings) - return context.transform(this) + return GdmlLoader(settings).transform(this).also { + it.children["light"] = settings.light + } } /** diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 29de1575..01abf310 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -28,8 +28,10 @@ public class ColorAccessor( } } -public fun Vision.color(): ReadOnlyProperty = ReadOnlyProperty { _, property -> - ColorAccessor(properties.root(true), property.name.asName()) +public fun Vision.color( + propertyName: Name? = null, +): ReadOnlyProperty = ReadOnlyProperty { _, property -> + ColorAccessor(properties.root(true), propertyName ?: property.name.asName()) } public var ColorAccessor?.string: String? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 3db461ef..95aca618 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -7,16 +7,20 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.node import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.number +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.visionforge.* @Serializable public abstract class LightSource : SolidBase() { override val descriptor: MetaDescriptor get() = LightSource.descriptor - public val color: ColorAccessor by color() - public var intensity: Number by properties.root(includeStyles = false).number { 1.0 } + public val color: ColorAccessor by color(SolidMaterial.COLOR_KEY) + public var intensity: Number by properties.root(includeStyles = false).number(INTENSITY_KEY) { 1.0 } + + public companion object { + public val INTENSITY_KEY: Name = "intensity".asName() - public companion object{ public val descriptor: MetaDescriptor by lazy { MetaDescriptor { value(Vision.VISIBLE_KEY, ValueType.BOOLEAN) { @@ -27,6 +31,7 @@ public abstract class LightSource : SolidBase() { value(LightSource::color.name, ValueType.STRING, ValueType.NUMBER) { inherited = false widgetType = "color" + default(Colors.white) } value(LightSource::intensity.name, ValueType.NUMBER) { @@ -34,11 +39,6 @@ public abstract class LightSource : SolidBase() { default(1.0) } - value(SolidMaterial.COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { - inherited = false - widgetType = "color" - } - node(Solid.POSITION_KEY) { hide() } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt index 3d420570..3f8e251c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -1,6 +1,12 @@ package space.kscience.visionforge.solid.three +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision +import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.AmbientLightSource +import space.kscience.visionforge.solid.LightSource +import space.kscience.visionforge.solid.SolidMaterial +import space.kscience.visionforge.visible import three.lights.AmbientLight import three.math.Color import kotlin.reflect.KClass @@ -14,6 +20,16 @@ public object ThreeAmbientLightFactory : ThreeFactory { intensity = vision.intensity.toDouble() } + if (observe) { + vision.onPropertyChange(three.context) { propertyName: Name -> + when (propertyName) { + Vision.VISIBLE_KEY -> res.visible = vision.visible ?: true + SolidMaterial.COLOR_KEY -> res.color = vision.color.threeColor() ?: Color(0x404040) + LightSource.INTENSITY_KEY -> res.intensity = vision.intensity.toDouble() + } + } + } + return res } } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index b3281e4b..30f3034b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -29,8 +29,6 @@ public abstract class ThreeMeshFactory( override fun build(three: ThreePlugin, vision: T, observe: Boolean): Mesh { val geometry = buildGeometry(vision) - //val meshMeta: Meta = obj.properties[Material3D.MATERIAL_KEY]?.node ?: Meta.empty - val mesh = Mesh(geometry, ThreeMaterials.DEFAULT).apply { matrixAutoUpdate = false //set position for mesh @@ -46,11 +44,10 @@ public abstract class ThreeMeshFactory( val oldGeometry = mesh.geometry val newGeometry = buildGeometry(vision) oldGeometry.attributes = newGeometry.attributes - //mesh.applyWireFrame(obj) + mesh.applyEdges(vision) newGeometry.dispose() } - //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) name.startsWith(EDGES_KEY) -> mesh.applyEdges(vision) else -> mesh.updateProperty(vision, name) } @@ -62,18 +59,12 @@ public abstract class ThreeMeshFactory( public companion object { internal const val EDGES_OBJECT_NAME: String = "@edges" - - //public val WIREFRAME_KEY: Name = "wireframe".asName() - - //public val WIREFRAME_ENABLED_KEY: Name = WIREFRAME_KEY + ENABLED_KEY - //public val WIREFRAME_MATERIAL_KEY: Name = WIREFRAME_KEY + SolidMaterial.MATERIAL_KEY } } internal fun Mesh.applyProperties(vision: Solid): Mesh = apply { setMaterial(vision) applyEdges(vision) - //applyWireFrame(obj) layers.set(vision.layer) children.forEach { it.layers.set(vision.layer) @@ -104,24 +95,3 @@ public fun Mesh.applyEdges(vision: Solid) { } } } - -//public fun Mesh.applyWireFrame(obj: Solid) { -// children.find { it.name == "@wireframe" }?.let { -// remove(it) -// (it as LineSegments).dispose() -// } -// //inherited wireframe definition, disabled by default -// if (obj.getProperty(MeshThreeFactory.WIREFRAME_ENABLED_KEY).boolean == true) { -// val bufferGeometry = geometry as? BufferGeometry ?: return -// val material = -// ThreeMaterials.getLineMaterial(obj.getProperty(MeshThreeFactory.WIREFRAME_MATERIAL_KEY).node, true) -// add( -// LineSegments( -// WireframeGeometry(bufferGeometry), -// material -// ).apply { -// name = "@wireframe" -// } -// ) -// } -//} \ No newline at end of file -- 2.34.1 From 81aa5d2fcc878fb49308a5cf963eeb7bd484be5a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Aug 2022 22:46:27 +0300 Subject: [PATCH 098/143] Replace plot properties by a wrapper --- .../mipt/npm/muon/monitor/MMAppComponent.kt | 2 +- gradle.properties | 2 +- .../kscience/visionforge/VisionProperties.kt | 3 +- .../visionforge/plotly/VisionOfPlotly.kt | 72 +++++++++++++++++-- .../visionforge/plotly/VisionOfPlotlyTest.kt | 22 ++++++ 5 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 3ecb7f9f..4c9649c6 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -25,9 +25,9 @@ import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.edges import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.edges import styled.css import styled.styledDiv import styled.styledSpan diff --git a/gradle.properties b/gradle.properties index aeb2ca21..668f0f5d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false -#kotlin.incremental.js.ir=true +kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index cddb6585..eb001b64 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -297,5 +297,4 @@ public operator fun MutableVisionProperties.set(name: Name, value: String): Unit setValue(name, value.asValue()) public operator fun MutableVisionProperties.set(name: String, value: String): Unit = - set(name.parseAsName(), value) - + set(name.parseAsName(), value) \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 2e89dbf5..54ba4551 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -1,25 +1,83 @@ package space.kscience.visionforge.plotly +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.asObservable +import kotlinx.serialization.Transient +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly -import space.kscience.visionforge.AbstractVision +import space.kscience.visionforge.MutableVisionProperties +import space.kscience.visionforge.Vision import space.kscience.visionforge.html.VisionOutput -import space.kscience.visionforge.root @Serializable @SerialName("vision.plotly") -public class VisionOfPlotly private constructor() : AbstractVision() { +public class VisionOfPlotly private constructor( + @Serializable(MutableMetaSerializer::class) public val meta: MutableMeta, +) : Vision { + public constructor(plot: Plot) : this(plot.meta) + + public val plot: Plot get() = Plot(meta.asObservable()) + + @Transient + override var parent: Vision? = null + + @Transient + override val properties: MutableVisionProperties = object : MutableVisionProperties { + override fun setProperty(name: Name, node: Meta?, notify: Boolean) { + meta.setMeta(name, node) + } + + override fun setValue(name: Name, value: Value?, notify: Boolean) { + meta.setValue(name, value) + } + + override val own: Meta get() = meta + + override val descriptor: MetaDescriptor? get() = this@VisionOfPlotly.descriptor + + override fun getProperty( + name: Name, + inherit: Boolean?, + includeStyles: Boolean?, + ): MutableMeta = meta.getMeta(name) ?: MutableMeta() + + override fun getValue( + name: Name, + inherit: Boolean?, + includeStyles: Boolean?, + ): Value? = meta.getValue(name) + + override val changes: Flow = if (meta is ObservableMeta) { + callbackFlow { + meta.onChange(this) { + launch { + send(it) + } + } + awaitClose { + meta.removeListener(this) + } + } + } else emptyFlow() + + + override fun invalidate(propertyName: Name) { + // Do nothing + } - public constructor(plot: Plot) : this() { - properties.setProperty(Name.EMPTY, plot.meta) } - public val plot: Plot get() = Plot(properties.root().asObservable()) + + override val descriptor: MetaDescriptor? = null // TODO add descriptor for Plot } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt b/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt new file mode 100644 index 00000000..7634e73d --- /dev/null +++ b/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt @@ -0,0 +1,22 @@ +package space.kscience.visionforge.plotly + +import space.kscience.plotly.Plotly +import space.kscience.plotly.scatter +import kotlin.test.Test +import kotlin.test.assertTrue + +class VisionOfPlotlyTest { + @Test + fun conversion(){ + val plot = Plotly.plot { + scatter { + x(1,2,3) + y(1,2,3) + } + } + val vision = VisionOfPlotly(plot) +// println(vision.plot.toJsonString()) +// println(vision.plot.data.toJsonString()) + assertTrue { vision.plot.data.first().x.doubles.size == 3} + } +} \ No newline at end of file -- 2.34.1 From 960d17855b6b78fbca348da3478f58cefcef8b36 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 25 Aug 2022 22:48:00 +0300 Subject: [PATCH 099/143] Fix client updates --- .../playground/src/jvmMain/kotlin/gdmlIaxo.kt | 6 --- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +- .../kscience/visionforge/VisionChange.kt | 44 ++++++++++++------- .../kscience/visionforge/VisionProperties.kt | 8 +++- .../kscience/visionforge/VisionClient.kt | 32 ++++++++++---- .../visionforge/server/VisionServer.kt | 5 ++- .../kscience/visionforge/three/jsMain.kt | 6 ++- 7 files changed, 69 insertions(+), 36 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt index ee47c461..954a30c9 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt @@ -1,20 +1,14 @@ package space.kscience.visionforge.examples import space.kscience.gdml.GdmlShowCase -import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.gdml import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.solid fun main() = makeVisionFile { vision("canvas") { requirePlugin(Solids) solid { - ambientLight { - color.set(Colors.white) - } gdml(GdmlShowCase.babyIaxo(), "D0") } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index e7326982..645073d3 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -6,6 +6,7 @@ import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.meta.Null import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors @@ -56,7 +57,8 @@ fun main() { val targetVision = sat[target] as Solid targetVision.color.set("red") delay(1000) - targetVision.color.clear() + //use to ensure that color is cleared + targetVision.color.value = Null delay(500) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 0001dd44..369900bf 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -5,6 +5,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -47,7 +49,7 @@ public object NullVision : Vision { /** * An update for a [Vision] */ -public class VisionChangeBuilder(private val manager: VisionManager) : MutableVisionContainer { +public class VisionChangeBuilder : MutableVisionContainer { private var vision: Vision? = null private var propertyChange = MutableMeta() @@ -57,7 +59,14 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi @Synchronized private fun getOrPutChild(visionName: Name): VisionChangeBuilder = - children.getOrPut(visionName) { VisionChangeBuilder(manager) } + children.getOrPut(visionName) { VisionChangeBuilder() } + + @Synchronized + internal fun reset() { + vision = null + propertyChange = MutableMeta() + children.clear() + } public fun propertyChanged(visionName: Name, propertyName: Name, item: Meta?) { if (visionName == Name.EMPTY) { @@ -82,10 +91,10 @@ public class VisionChangeBuilder(private val manager: VisionManager) : MutableVi /** * Isolate collected changes by creating detached copies of given visions */ - public fun deepCopy(): VisionChange = VisionChange( - vision?.deepCopy(manager), + public fun deepCopy(visionManager: VisionManager): VisionChange = VisionChange( + vision?.deepCopy(visionManager), if (propertyChange.isEmpty()) null else propertyChange.seal(), - if (children.isEmpty()) null else children.mapValues { it.value.deepCopy() } + if (children.isEmpty()) null else children.mapValues { it.value.deepCopy(visionManager) } ) } @@ -102,12 +111,13 @@ public data class VisionChange( ) public inline fun VisionManager.VisionChange(block: VisionChangeBuilder.() -> Unit): VisionChange = - VisionChangeBuilder(this).apply(block).deepCopy() + VisionChangeBuilder().apply(block).deepCopy(this) private fun CoroutineScope.collectChange( name: Name, source: Vision, + mutex: Mutex, collector: () -> VisionChangeBuilder, ) { @@ -120,7 +130,7 @@ private fun CoroutineScope.collectChange( val children = source.children //Subscribe for children changes children?.forEach { token, child -> - collectChange(name + token, child, collector) + collectChange(name + token, child, mutex, collector) } //Subscribe for structure change @@ -128,9 +138,11 @@ private fun CoroutineScope.collectChange( val after = children[changedName] val fullName = name + changedName if (after != null) { - collectChange(fullName, after, collector) + collectChange(fullName, after, mutex, collector) + } + mutex.withLock { + collector().setChild(fullName, after) } - collector().setChild(fullName, after) }?.launchIn(this) } @@ -141,24 +153,26 @@ public fun Vision.flowChanges( collectionDuration: Duration, ): Flow = flow { val manager = manager ?: error("Orphan vision could not collect changes") - - var collector = VisionChangeBuilder(manager) coroutineScope { - collectChange(Name.EMPTY, this@flowChanges) { collector } + val collector = VisionChangeBuilder() + val mutex = Mutex() + collectChange(Name.EMPTY, this@flowChanges, mutex) { collector } //Send initial vision state val initialChange = VisionChange(vision = deepCopy(manager)) emit(initialChange) - while (currentCoroutineContext().isActive) { + while (true) { //Wait for changes to accumulate delay(collectionDuration) //Propagate updates only if something is changed if (!collector.isEmpty()) { //emit changes - emit(collector.deepCopy()) + emit(collector.deepCopy(manager)) //Reset the collector - collector = VisionChangeBuilder(manager) + mutex.withLock { + collector.reset() + } } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index eb001b64..52bdd52f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -189,7 +189,9 @@ public abstract class AbstractVisionProperties( } override fun setProperty(name: Name, node: Meta?, notify: Boolean) { - //TODO check old value? + //ignore if the value is the same as existing + if (own?.getMeta(name) == node) return + if (name.isEmpty()) { properties = node?.asMutableMeta() } else if (node == null) { @@ -203,7 +205,9 @@ public abstract class AbstractVisionProperties( } override fun setValue(name: Name, value: Value?, notify: Boolean) { - //TODO check old value? + //ignore if the value is the same as existing + if (own?.getValue(name) == value) return + if (value == null) { properties?.getMeta(name)?.value = null } else { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 41e3b8e6..f54b7d5d 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -3,8 +3,8 @@ package space.kscience.visionforge import kotlinx.browser.document import kotlinx.browser.window import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.w3c.dom.* import org.w3c.dom.url.URL import space.kscience.dataforge.context.* @@ -63,6 +63,17 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null + + private val changeCollector = VisionChangeBuilder() + + public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { + changeCollector.propertyChanged(visionName, propertyName, item) + } + + public fun visionChanged(name: Name?, child: Vision?) { + changeCollector.setChild(name, child) + } + private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { vision.setAsRoot(visionManager) @@ -115,12 +126,13 @@ public class VisionClient : AbstractPlugin() { val feedbackAggregationTime = meta["aggregationTime"]?.int ?: 300 onopen = { - feedbackJob = vision.flowChanges( - feedbackAggregationTime.milliseconds, - ).onEach { change -> - send(visionManager.encodeToString(change)) - }.launchIn(visionManager.context) - + feedbackJob = visionManager.context.launch { + delay(feedbackAggregationTime.milliseconds) + if (!changeCollector.isEmpty()) { + send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) + changeCollector.reset() + } + } console.info("WebSocket update channel established for output '$name'") } @@ -165,6 +177,7 @@ public class VisionClient : AbstractPlugin() { logger.info { "Found embedded vision for output with name $name" } renderVision(name, element, embeddedVision, outputMeta) } + element.attributes[OUTPUT_FETCH_ATTRIBUTE] != null -> { val attr = element.attributes[OUTPUT_FETCH_ATTRIBUTE]!! @@ -192,6 +205,7 @@ public class VisionClient : AbstractPlugin() { } } } + else -> error("No embedded vision data / fetch url for $name") } element.setAttribute(OUTPUT_RENDERED, "true") @@ -204,7 +218,7 @@ public class VisionClient : AbstractPlugin() { ) else super.content(target) public companion object : PluginFactory { - override fun build(context: Context, meta: Meta): VisionClient = VisionClient() + override fun build(context: Context, meta: Meta): VisionClient = VisionClient() override val tag: PluginTag = PluginTag(name = "vision.client", group = PluginTag.DATAFORGE_GROUP) diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index d4bf939f..967a5d82 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -122,8 +122,10 @@ public class VisionServer internal constructor( launch { incoming.consumeEach { + val data = it.data.decodeToString() + application.log.debug("Received update: \n$data") val change = visionManager.jsonFormat.decodeFromString( - VisionChange.serializer(), it.data.decodeToString() + VisionChange.serializer(),data ) vision.update(change) } @@ -136,6 +138,7 @@ public class VisionServer internal constructor( VisionChange.serializer(), update ) + application.log.debug("Sending update: \n$json") outgoing.send(Frame.Text(json)) }.collect() } diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index ed2908f5..69a9ac51 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -6,6 +6,8 @@ import space.kscience.visionforge.solid.three.ThreePlugin @DFExperimental -public fun main(): Unit = runVisionClient { - plugin(ThreePlugin) +public fun main(): Unit { + runVisionClient { + plugin(ThreePlugin) + } } \ No newline at end of file -- 2.34.1 From 3c51060e2eb157489ace0e0e28637a34af38bea3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 17 Nov 2022 21:49:14 +0300 Subject: [PATCH 100/143] Refactor pages --- CHANGELOG.md | 1 + build.gradle.kts | 33 ++++--- .../mipt/npm/root/serialization/jsonToRoot.kt | 1 + .../src/jvmMain/kotlin/formServer.kt | 4 +- .../src/jvmMain/kotlin/plotlyVision.kt | 85 +++++++++++++++++- .../src/jvmMain/kotlin/serverExtensions.kt | 8 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 7 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 2 +- .../visionforge/bootstrap/outputConfig.kt | 2 +- .../bootstrap/visionPropertyEditor.kt | 1 - .../kscience/visionforge/react/MetaViewer.kt | 2 +- .../visionforge/react/MultiSelectChooser.kt | 2 +- .../visionforge/react/PropertyEditor.kt | 2 +- .../visionforge/react/RangeValueChooser.kt | 2 +- .../kscience/visionforge/react/VisionTree.kt | 2 +- .../visionforge/react/valueChooser.kt | 2 +- .../ringPropertyEditor.kt | 1 - .../ringThreeControls.kt | 2 +- visionforge-core/build.gradle.kts | 2 +- .../kscience/visionforge/VisionChange.kt | 18 ++-- .../html/{Page.kt => VisionPage.kt} | 11 ++- .../kscience/visionforge/html/headers.kt | 2 +- .../kscience/visionforge/html/htmlExport.kt | 11 ++- .../visionforge/markup/MarkupPlugin.kt | 5 ++ .../visionforge/markup/MarkupPlugin.kt | 2 +- .../visionforge/markup/MarkupPlugin.kt | 24 +++++ .../visionforge/server/VisionServer.kt | 88 ++++++++++++------- visionforge-threejs/build.gradle.kts | 1 + .../solid/three/ThreeCanvasLabelFactory.kt | 15 ++-- .../visionforge/three/serverExtensions.kt | 8 +- 32 files changed, 252 insertions(+), 98 deletions(-) rename visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/{Page.kt => VisionPage.kt} (82%) create mode 100644 visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt create mode 100644 visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b7d7766..afc740a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - MeshLine for thick lines ### Changed +- API update for server and pages - Edges moved to solids module for easier construction - Visions **must** be rooted in order to subscribe to updates. - Visions use flows instead of direct subscriptions. diff --git a/build.gradle.kts b/build.gradle.kts index 939d197b..7be6270f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,7 @@ +import space.kscience.gradle.isInDevelopment +import space.kscience.gradle.useApache2Licence +import space.kscience.gradle.useSPCTeam + plugins { id("space.kscience.gradle.project") // id("org.jetbrains.kotlinx.kover") version "0.5.0" @@ -6,9 +10,9 @@ plugins { val dataforgeVersion by extra("0.6.0-dev-15") val fxVersion by extra("11") -allprojects{ +allprojects { group = "space.kscience" - version = "0.3.0-dev-2" + version = "0.3.0-dev-3" } subprojects { @@ -21,16 +25,26 @@ subprojects { maven("https://maven.jzy3d.org/releases") } - tasks.withType{ - kotlinOptions{ + tasks.withType { + kotlinOptions { freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" } } } ksciencePublish { - github("visionforge") - space() + pom("https://github.com/SciProgCentre/visionforge") { + useApache2Licence() + useSPCTeam() + } + github(githubProject = "visionforge", githubOrg = "SciProgCentre") + space( + if (isInDevelopment) { + "https://maven.pkg.jetbrains.space/spc/p/sci/dev" + } else { + "https://maven.pkg.jetbrains.space/spc/p/sci/maven" + } + ) sonatype() } @@ -38,9 +52,4 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") - - -//rootProject.extensions.configure { -// versions.webpackCli.version = "4.10.0" -//} \ No newline at end of file +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index 96c6098c..1685c1ac 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -218,6 +218,7 @@ private object RootDecoder { var value: Any? = null + @Suppress("UNCHECKED_CAST") fun getOrPutValue(builder: (JsonElement) -> T): T { if (value == null) { value = builder(element) diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 7397b6b6..4d60a423 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -4,7 +4,7 @@ import kotlinx.html.* import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.server.close @@ -15,7 +15,7 @@ fun main() { val visionManager = Global.fetch(VisionManager) val server = visionManager.serve { - page(header = Page.scriptHeader("js/visionforge-playground.js")) { + page(VisionPage.scriptHeader("js/visionforge-playground.js")) { val form = formFragment("form") { label { htmlFor = "fname" diff --git a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt index 4b91c352..c1ef18a8 100644 --- a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt +++ b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt @@ -1,15 +1,92 @@ package space.kscience.visionforge.examples -import space.kscience.plotly.scatter +import space.kscience.dataforge.meta.Value +import space.kscience.plotly.layout +import space.kscience.plotly.models.* import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.plotly.plotly fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { vision { + val trace1 = Violin { + text("sample length: 32") + marker { + line { + width = 2 + color("#bebada") + } + symbol = Symbol.valueOf("line-ns") + } + orientation = Orientation.h + hoveron = ViolinHoveron.`points+kde` + meanline { + visible = true + } + legendgroup = "F" + scalegroup = "F" + points = ViolinPoints.all + pointpos = 1.2 + jitter = 0 + box { + visible = true + } + scalemode = ViolinScaleMode.count + showlegend = false + side = ViolinSide.positive + y0 = Value.of(0) + line { + color("#bebada") + } + name = "F" + + x(10.07, 34.83, 10.65, 12.43, 24.08, 13.42, 12.48, 29.8, 14.52, 11.38, + 20.27, 11.17, 12.26, 18.26, 8.51, 10.33, 14.15, 13.16, 17.47, 27.05, 16.43, + 8.35, 18.64, 11.87, 19.81, 43.11, 13.0, 12.74, 13.0, 16.4, 16.47, 18.78) + } + + val trace2 = Violin { + text("sample length: 32") + marker { + line { + width = 2 + color("#8dd3c7") + } + symbol = Symbol.valueOf("line-ns") + } + orientation = Orientation.h + hoveron = ViolinHoveron.`points+kde` + meanline { + visible = true + } + legendgroup = "M" + scalegroup = "M" + points = ViolinPoints.all + pointpos = -1.2 + jitter = 0 + box { + visible = true + } + scalemode = ViolinScaleMode.count + showlegend = false + side = ViolinSide.negative + y0 = Value.of(0) + + line { + color("#8dd3c7") + } + name = "M" + + x(27.2, 22.76, 17.29, 19.44, 16.66, 32.68, 15.98, 13.03, 18.28, 24.71, + 21.16, 11.69, 14.26, 15.95, 8.52, 22.82, 19.08, 16.0, 34.3, 41.19, 9.78, + 7.51, 28.44, 15.48, 16.58, 7.56, 10.34, 13.51, 18.71, 20.53) + } + plotly { - scatter { - x(1, 2, 3) - y(5, 8, 7) + traces(trace1, trace2) + layout { + width = 800 + height = 800 + title = "Advanced Violin Plot" } } } diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index e8be7112..eda8ba2b 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.examples import space.kscience.dataforge.context.Global import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.importScriptHeader import space.kscience.visionforge.makeFile import java.awt.Desktop @@ -16,10 +16,10 @@ public fun makeVisionFile( show: Boolean = true, content: HtmlVisionFragment, ): Unit { - val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> + val actualPath = VisionPage(Global, content = content).makeFile(path) { actualPath -> mapOf( - "title" to Page.title(title), - "playground" to Page.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + "title" to VisionPage.title(title), + "playground" to VisionPage.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 645073d3..9c645d81 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -10,8 +10,8 @@ import space.kscience.dataforge.meta.Null import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.plus +import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.server.DataServeMode import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.serve @@ -37,7 +37,8 @@ fun main() { } val server = satContext.visionManager.serve { - page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { + dataMode = DataServeMode.UPDATE + page(VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css")) { div("flex-column") { h1 { +"Satellite detector demo" } vision { sat } diff --git a/gradle.properties b/gradle.properties index 668f0f5d..056b8ac8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.12.0-kotlin-1.7.20-Beta \ No newline at end of file +toolsVersion=0.13.3-kotlin-1.7.20 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fce..ae04661e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt index 2fbe51c8..944f1493 100644 --- a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -49,7 +49,7 @@ public abstract class JupyterPluginBase(final override val context: Context) : J } - render { page -> + render { page -> HTML(page.render(createHTML()), true) } diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 3dfba202..a37469ca 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -8,7 +8,7 @@ import kotlinx.css.padding import kotlinx.css.properties.border import kotlinx.css.px import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event +import kotlinx.html.org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FC diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 5e30f838..6ea0659c 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.bootstrap import org.w3c.dom.Element import react.RBuilder import react.dom.client.createRoot -import react.key import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.isEmpty import space.kscience.visionforge.Vision diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 651c9d31..d6fff754 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.react import kotlinx.css.Align import kotlinx.css.alignItems import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event +import kotlinx.html.org.w3c.dom.events.Event import react.* import react.dom.a import react.dom.attrs diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index fc635d21..5e8da06c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -1,10 +1,10 @@ package space.kscience.visionforge.react import kotlinx.html.js.onChangeFunction +import kotlinx.html.org.w3c.dom.events.Event import org.w3c.dom.HTMLOptionElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.asList -import org.w3c.dom.events.Event import react.FC import react.dom.attrs import react.dom.option diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index f5d28f19..a31a04fb 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.css.properties.TextDecoration import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event +import kotlinx.html.org.w3c.dom.events.Event import react.* import react.dom.attrs import space.kscience.dataforge.meta.* diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 309e4b7f..3ebe4d51 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -4,8 +4,8 @@ import kotlinx.css.pct import kotlinx.css.width import kotlinx.html.InputType import kotlinx.html.js.onChangeFunction +import kotlinx.html.org.w3c.dom.events.Event import org.w3c.dom.HTMLInputElement -import org.w3c.dom.events.Event import react.FC import react.dom.attrs import react.fc diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 9866c30e..8ec0185c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -7,7 +7,7 @@ import kotlinx.css.cursor import kotlinx.css.properties.TextDecorationLine import kotlinx.css.properties.textDecoration import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event +import kotlinx.html.org.w3c.dom.events.Event import react.* import react.dom.attrs import space.kscience.dataforge.names.Name diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 96c1e6fe..bc6f1979 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -7,9 +7,9 @@ import kotlinx.css.width import kotlinx.html.InputType import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onKeyDownFunction +import kotlinx.html.org.w3c.dom.events.Event import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement -import org.w3c.dom.events.Event import react.FC import react.Props import react.dom.attrs diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt index b4ce3284..a3f81adb 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt @@ -4,7 +4,6 @@ import org.w3c.dom.Element import react.RBuilder import react.dom.client.createRoot import react.dom.p -import react.key import ringui.Island import ringui.SmartTabs import ringui.Tab diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 6a440e71..d59b37b9 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -8,7 +8,7 @@ import kotlinx.css.padding import kotlinx.css.properties.border import kotlinx.css.px import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event +import kotlinx.html.org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FC diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index a8886521..6a170d02 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -9,7 +9,7 @@ kotlin { commonMain { dependencies { api("space.kscience:dataforge-context:$dataforgeVersion") - api(npmlibs.kotlinx.html) + api("org.jetbrains.kotlinx:kotlinx-html:0.8.0") api("org.jetbrains.kotlin-wrappers:kotlin-css") } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 369900bf..e95dbd1b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -118,14 +118,14 @@ private fun CoroutineScope.collectChange( name: Name, source: Vision, mutex: Mutex, - collector: () -> VisionChangeBuilder, + collector: VisionChangeBuilder, ) { //Collect properties change - source.onPropertyChange(this) { propertyName -> + source.properties.changes.onEach { propertyName -> val newItem = source.properties.own?.get(propertyName) - collector().propertyChanged(name, propertyName, newItem) - } + collector.propertyChanged(name, propertyName, newItem) + }.launchIn(this) val children = source.children //Subscribe for children changes @@ -141,7 +141,7 @@ private fun CoroutineScope.collectChange( collectChange(fullName, after, mutex, collector) } mutex.withLock { - collector().setChild(fullName, after) + collector.setChild(fullName, after) } }?.launchIn(this) } @@ -156,7 +156,7 @@ public fun Vision.flowChanges( coroutineScope { val collector = VisionChangeBuilder() val mutex = Mutex() - collectChange(Name.EMPTY, this@flowChanges, mutex) { collector } + collectChange(Name.EMPTY, this@flowChanges, mutex, collector) //Send initial vision state val initialChange = VisionChange(vision = deepCopy(manager)) @@ -167,10 +167,10 @@ public fun Vision.flowChanges( delay(collectionDuration) //Propagate updates only if something is changed if (!collector.isEmpty()) { - //emit changes - emit(collector.deepCopy(manager)) - //Reset the collector mutex.withLock { + //emit changes + emit(collector.deepCopy(manager)) + //Reset the collector collector.reset() } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt similarity index 82% rename from visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt rename to visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt index bdd5e417..cb284b14 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt @@ -3,9 +3,14 @@ package space.kscience.visionforge.html import kotlinx.html.* import space.kscience.dataforge.context.Context -public data class Page( +/** + * A structure representing a single page with Visions to be rendered. + * + * @param pageHeaders static headers for this page. + */ +public data class VisionPage( public val context: Context, - public val headers: Map = emptyMap(), + public val pageHeaders: Map = emptyMap(), public val content: HtmlVisionFragment, ) { public fun render(root: TagConsumer): R = root.apply { @@ -13,7 +18,7 @@ public data class Page( meta { charset = "utf-8" } - headers.values.forEach { + pageHeaders.values.forEach { fragment(it) } } diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index d8be2a39..71410372 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -114,7 +114,7 @@ internal fun fileCssHeader( /** * Make a script header from a resource file, automatically copying file to appropriate location */ -public fun Page.Companion.importScriptHeader( +public fun VisionPage.Companion.importScriptHeader( scriptResource: String, resourceLocation: ResourceLocation, htmlPath: Path? = null, diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index 63f405c3..b3063eb1 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge import kotlinx.html.stream.createHTML import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.HtmlFragment -import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.VisionPage import java.awt.Desktop import java.nio.file.Files import java.nio.file.Path @@ -54,8 +54,11 @@ import java.nio.file.Path // } //} +/** + * Export a [VisionPage] to a file + */ @DFExperimental -public fun Page.makeFile( +public fun VisionPage.makeFile( path: Path?, defaultHeaders: ((Path) -> Map)? = null, ): Path { @@ -64,7 +67,7 @@ public fun Page.makeFile( } ?: Files.createTempFile("tempPlot", ".html") val actualDefaultHeaders = defaultHeaders?.invoke(actualFile) - val actualPage = if (actualDefaultHeaders == null) this else copy(headers = actualDefaultHeaders + headers) + val actualPage = if (actualDefaultHeaders == null) this else copy(pageHeaders = actualDefaultHeaders + pageHeaders) val htmlString = actualPage.render(createHTML()) @@ -73,7 +76,7 @@ public fun Page.makeFile( } @DFExperimental -public fun Page.show(path: Path? = null) { +public fun VisionPage.show(path: Path? = null) { val actualPath = makeFile(path) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } \ No newline at end of file diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt new file mode 100644 index 00000000..7ff98f91 --- /dev/null +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -0,0 +1,5 @@ +package space.kscience.visionforge.markup + +import space.kscience.visionforge.VisionPlugin + +public expect class MarkupPlugin: VisionPlugin \ No newline at end of file diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 939669a0..d7ebba04 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -16,7 +16,7 @@ import space.kscience.visionforge.markup.VisionOfMarkup.Companion.COMMONMARK_FOR import space.kscience.visionforge.markup.VisionOfMarkup.Companion.GFM_FORMAT import kotlin.reflect.KClass -public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { +public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: VisionClient by require(VisionClient) override val tag: PluginTag get() = Companion.tag override val visionSerializersModule: SerializersModule get() = markupSerializersModule diff --git a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt new file mode 100644 index 00000000..211064ff --- /dev/null +++ b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -0,0 +1,24 @@ +package space.kscience.visionforge.markup + +import kotlinx.serialization.modules.SerializersModule +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.VisionPlugin +import kotlin.reflect.KClass + +public actual class MarkupPlugin : VisionPlugin() { + override val visionSerializersModule: SerializersModule get() = markupSerializersModule + + override val tag: PluginTag get() = Companion.tag + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) + + override val type: KClass = MarkupPlugin::class + + override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() + + } +} \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 967a5d82..364d3162 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,7 +1,10 @@ package space.kscience.visionforge.server import io.ktor.http.* -import io.ktor.server.application.* +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.application.log import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.embeddedServer @@ -24,7 +27,6 @@ import kotlinx.coroutines.withContext import kotlinx.html.* import kotlinx.html.stream.createHTML import space.kscience.dataforge.meta.* -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange @@ -32,6 +34,7 @@ import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop @@ -39,6 +42,23 @@ import java.net.URI import kotlin.time.Duration.Companion.milliseconds +public enum class DataServeMode { + /** + * Embed the initial state of the vision inside its html tag. + */ + EMBED, + + /** + * Fetch data on vision load. Do not embed data. + */ + FETCH, + + /** + * Connect to server to get pushes. The address of the server is embedded in the tag. + */ + UPDATE +} + /** * A ktor plugin container with given [routing] * @param serverUrl a server url including root route @@ -63,25 +83,20 @@ public class VisionServer internal constructor( */ public var cacheFragments: Boolean by meta.boolean(true) - /** - * Embed the initial state of the vision inside its html tag. Default: `true` - */ - public var dataEmbed: Boolean by meta.boolean(true, Name.parse("data.embed")) + public var dataMode: DataServeMode by meta.enum(DataServeMode.UPDATE) + + private val serverHeaders: MutableMap = mutableMapOf() /** - * Fetch data on vision load. Overrides embedded data. Default: `false` + * Set up a default header that is automatically added to all pages on this server */ - public var dataFetch: Boolean by meta.boolean(false, Name.parse("data.fetch")) - - /** - * Connect to server to get pushes. The address of the server is embedded in the tag. Default: `true` - */ - public var dataUpdate: Boolean by meta.boolean(true, Name.parse("data.update")) + public fun header(key: String, block: HtmlFragment) { + serverHeaders[key] = block + } private fun HTML.visionPage( - title: String, pagePath: String, - header: HtmlFragment, + headers: Map, visionFragment: HtmlVisionFragment, ): Map { var visionMap: Map? = null @@ -89,17 +104,18 @@ public class VisionServer internal constructor( head { meta { charset = "utf-8" - header() } - title(title) - consumer.header() + (serverHeaders + headers).values.forEach { + consumer.it() + } } body { //Load the fragment and remember all loaded visions visionMap = visionFragment( context = visionManager.context, - embedData = true, - fetchUpdatesUrl = "$serverUrl$pagePath/ws", + embedData = dataMode == DataServeMode.EMBED, + fetchDataUrl = if (dataMode != DataServeMode.EMBED) "$serverUrl$pagePath/data" else null, + fetchUpdatesUrl = if (dataMode == DataServeMode.UPDATE) "$serverUrl$pagePath/ws" else null, fragment = visionFragment ) } @@ -110,7 +126,6 @@ public class VisionServer internal constructor( /** * Server a map of visions without providing explicit html page for them */ - @OptIn(DFExperimental::class) private fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") @@ -125,7 +140,7 @@ public class VisionServer internal constructor( val data = it.data.decodeToString() application.log.debug("Received update: \n$data") val change = visionManager.jsonFormat.decodeFromString( - VisionChange.serializer(),data + VisionChange.serializer(), data ) vision.update(change) } @@ -133,7 +148,7 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(updateInterval.milliseconds).onEach { update -> + vision.flowChanges(updateInterval.milliseconds).onEach { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update @@ -191,12 +206,11 @@ public class VisionServer internal constructor( }.finalize() /** - * Serve a page, potentially containing any number of visions at a given [pagePath] with given [headers]. + * Serve a page, potentially containing any number of visions at a given [route] with given [header]. */ public fun page( - pagePath: String = DEFAULT_PAGE, - title: String = "VisionForge server page '$pagePath'", - header: HtmlFragment = {}, + route: String = DEFAULT_PAGE, + headers: Map, visionFragment: HtmlVisionFragment, ) { val visions = HashMap() @@ -204,13 +218,13 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(visionPage(title, pagePath, header, visionFragment)) + visions.putAll(visionPage(route, headers, visionFragment)) } } else { null } - root.route(pagePath) { + root.route(route) { serveVisions(this, visions) //filled pages get { @@ -218,7 +232,7 @@ public class VisionServer internal constructor( //re-create html and vision list on each call call.respondHtml { visions.clear() - visions.putAll(visionPage(title, pagePath, header, visionFragment)) + visions.putAll(visionPage(route, headers, visionFragment)) } } else { //Use cached html @@ -226,8 +240,22 @@ public class VisionServer internal constructor( } } } + } + public fun page( + vararg headers: HtmlFragment, + route: String = DEFAULT_PAGE, + title: String = "VisionForge server page '$route'", + visionFragment: HtmlVisionFragment, + ) { + page(route, mapOf("title" to VisionPage.title(title)) + headers.associateBy { it.hashCode().toString() }, visionFragment) + } + /** + * Render given [VisionPage] at server + */ + public fun page(route: String, page: VisionPage) { + page(route = route, headers = page.pageHeaders, visionFragment = page.content) } public companion object { diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 7ba2c555..7cf2a60f 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -3,6 +3,7 @@ plugins { } kotlin{ + explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled js{ binaries.library() } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 7a0f1c7b..b9f2a7d2 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -24,6 +24,9 @@ public object ThreeCanvasLabelFactory : ThreeFactory { override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { val canvas = document.createElement("canvas") as HTMLCanvasElement + canvas.width = 200 + canvas.height = 200 + canvas.getContext("2d").apply { this as CanvasRenderingContext2D font = "Bold ${vision.fontSize}pt ${vision.fontFamily}" @@ -43,15 +46,13 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val texture = Texture(canvas) texture.needsUpdate = true - val material = MeshBasicMaterial().apply { - map = texture - side = DoubleSide - transparent = true - } - val mesh = Mesh( PlaneGeometry(canvas.width, canvas.height), - material + MeshBasicMaterial().apply { + map = texture + side = DoubleSide + transparent = true + } ) mesh.updatePosition(vision) diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt index 6c70e0ed..1261a0de 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -8,7 +8,7 @@ import java.awt.Desktop import java.nio.file.Path -public val Page.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") +public val VisionPage.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") @DFExperimental @@ -19,10 +19,10 @@ public fun makeThreeJsFile( show: Boolean = true, content: HtmlVisionFragment, ): Unit { - val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> + val actualPath = VisionPage(Global, content = content).makeFile(path) { actualPath -> mapOf( - "title" to Page.title(title), - "threeJs" to Page.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) + "title" to VisionPage.title(title), + "threeJs" to VisionPage.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) -- 2.34.1 From eae1316de5fb9703c31589f358f2d06df731c49f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 20 Nov 2022 19:42:05 +0300 Subject: [PATCH 101/143] Update static/dynamic rendering logic --- build.gradle.kts | 2 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 4 +- demo/playground/notebooks/demo3D.ipynb | 339 ++++++++++++++++++ .../src/jsMain/kotlin/playgroundMain.kt | 2 + .../kotlin/VisionForgePlayGroundForJupyter.kt | 4 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 2 - .../visionforge/solid/demo/ThreeDemoApp.kt | 4 +- jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt | 51 +++ ...onForgeForNotebook.kt => VFForNotebook.kt} | 44 ++- ...yterPluginBase.kt => VFIntegrationBase.kt} | 31 +- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 4 +- .../visionforge/html/HtmlVisionRenderer.kt | 28 +- .../kscience/visionforge/html/VisionPage.kt | 14 - .../space/kscience/visionforge/Application.kt | 22 +- .../kscience/visionforge/VisionClient.kt | 48 ++- .../kscience/visionforge/html/htmlExport.kt | 27 +- .../visionforge/server/VisionServer.kt | 17 +- 17 files changed, 539 insertions(+), 104 deletions(-) create mode 100644 demo/playground/notebooks/demo3D.ipynb create mode 100644 jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt rename jupyter/src/jvmMain/kotlin/{VisionForgeForNotebook.kt => VFForNotebook.kt} (70%) rename jupyter/src/jvmMain/kotlin/{JupyterPluginBase.kt => VFIntegrationBase.kt} (66%) diff --git a/build.gradle.kts b/build.gradle.kts index 7be6270f..b5e3fd7e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-3" + version = "0.3.0-dev-4" } subprojects { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 4b18291b..50e51859 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,6 +1,6 @@ package ru.mipt.npm.muon.monitor -import kotlinx.browser.document +import org.w3c.dom.Document import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch @@ -13,7 +13,7 @@ import space.kscience.visionforge.startApplication private class MMDemoApp : Application { - override fun start(state: Map) { + override fun start(document: Document, state: Map) { val context = Context("MM-demo") { plugin(ThreePlugin) diff --git a/demo/playground/notebooks/demo3D.ipynb b/demo/playground/notebooks/demo3D.ipynb new file mode 100644 index 00000000..1efcd3c5 --- /dev/null +++ b/demo/playground/notebooks/demo3D.ipynb @@ -0,0 +1,339 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "pycharm": { + "is_executing": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "@file:DependsOn(\"../build/libs/playground-0.3.0-dev-4-all.jar\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Starting VisionForge server on http://localhost:7777

\n" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vf.startServer()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import kotlinx.coroutines.*\n", + "import kotlin.random.Random\n", + "\n", + "Plotly.plot{\n", + " scatter{\n", + " x(1,2,3)\n", + " y(1,2,3)\n", + " if(vf.isServerRunning()){\n", + " vf.launch{\n", + " while(isActive){\n", + " delay(500)\n", + " y(Random.nextDouble(), Random.nextDouble(), Random.nextDouble())\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "vf.stopServer()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "codemirror_mode": "text/x-kotlin", + "file_extension": ".kt", + "mimetype": "text/x-kotlin", + "name": "kotlin", + "nbconvert_exporter": "", + "pygments_lexer": "kotlin", + "version": "1.8.0-dev-3517" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 3ad34867..8e259d48 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -1,4 +1,5 @@ import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.jupyter.VFNotebookPlugin import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin @@ -11,4 +12,5 @@ fun main() = runVisionClient { plugin(PlotlyPlugin) plugin(MarkupPlugin) plugin(TableVisionJsPlugin) + plugin(VFNotebookPlugin) } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 651b580d..212d906e 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -6,13 +6,13 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.jupyter.JupyterPluginBase +import space.kscience.visionforge.jupyter.VFIntegrationBase import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids @DFExperimental -internal class VisionForgePlayGroundForJupyter : JupyterPluginBase( +internal class VisionForgePlayGroundForJupyter : VFIntegrationBase( Context("VisionForge") { plugin(Solids) plugin(PlotlyPlugin) diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 9c645d81..23699443 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.server.DataServeMode import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.serve @@ -37,7 +36,6 @@ fun main() { } val server = satContext.visionManager.serve { - dataMode = DataServeMode.UPDATE page(VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css")) { div("flex-column") { h1 { +"Satellite detector demo" } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt index eb27f4d6..5bdbcefe 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.solid.demo -import kotlinx.browser.document import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import org.w3c.dom.Document import space.kscience.visionforge.Application import space.kscience.visionforge.solid.x import space.kscience.visionforge.solid.y @@ -12,7 +12,7 @@ import kotlin.random.Random private class ThreeDemoApp : Application { - override fun start(state: Map) { + override fun start(document: Document, state: Map) { val element = document.getElementById("demo") ?: error("Element with id 'demo' not found on page") diff --git a/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt b/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt new file mode 100644 index 00000000..c13586ba --- /dev/null +++ b/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt @@ -0,0 +1,51 @@ +package space.kscience.visionforge.jupyter + +import kotlinx.browser.window +import org.w3c.dom.Element +import space.kscience.dataforge.context.AbstractPlugin +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.renderAllVisions +import space.kscience.visionforge.renderAllVisionsById +import space.kscience.visionforge.renderAllVisionsIn +import kotlin.reflect.KClass + +@JsExport +public class VFNotebookPlugin : AbstractPlugin() { + private val client by require(VisionClient) + + public fun renderAllVisionsIn(element: Element) { + client.renderAllVisionsIn(element) + } + + public fun renderAllVisionsById(id: String) { + client.renderAllVisionsById(id) + } + + public fun renderAllVisions() { + client.renderAllVisions() + } + + + init { + //register VisionForge in the browser window + window.asDynamic().vf = this + window.asDynamic().VisionForge = this + } + + @Suppress("NON_EXPORTABLE_TYPE") + override val tag: PluginTag get() = Companion.tag + + @Suppress("NON_EXPORTABLE_TYPE") + public companion object : PluginFactory { + override fun build(context: Context, meta: Meta): VFNotebookPlugin = VFNotebookPlugin() + + override val tag: PluginTag = PluginTag(name = "vision.notebook", group = PluginTag.DATAFORGE_GROUP) + + override val type: KClass = VFNotebookPlugin::class + } + +} \ No newline at end of file diff --git a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt similarity index 70% rename from jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt rename to jupyter/src/jvmMain/kotlin/VFForNotebook.kt index a91733ce..4c7b4e29 100644 --- a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt @@ -1,11 +1,9 @@ package space.kscience.visionforge.jupyter import io.ktor.server.engine.ApplicationEngine -import kotlinx.html.FORM -import kotlinx.html.TagConsumer -import kotlinx.html.p +import kotlinx.coroutines.CoroutineScope +import kotlinx.html.* import kotlinx.html.stream.createHTML -import kotlinx.html.style import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult import space.kscience.dataforge.context.Context @@ -21,11 +19,21 @@ import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.VisionServer import space.kscience.visionforge.server.serve import space.kscience.visionforge.visionManager +import kotlin.coroutines.CoroutineContext +import kotlin.random.Random +import kotlin.random.nextUInt + +internal fun TagConsumer<*>.renderScriptForId(id: String) { + script { + type = "text/javascript" + unsafe { +"VisionForge.renderAllVisionsById(\"$id\");" } + } +} /** * A handler class that includes a server and common utilities */ -public class VisionForgeForNotebook(override val context: Context) : ContextAware { +public class VFForNotebook(override val context: Context) : ContextAware, CoroutineScope { private var counter = 0 private var engine: ApplicationEngine? = null @@ -33,6 +41,8 @@ public class VisionForgeForNotebook(override val context: Context) : ContextAwar public var isolateFragments: Boolean = false + override val coroutineContext: CoroutineContext get() = context.coroutineContext + public fun legacyMode() { isolateFragments = true } @@ -68,15 +78,29 @@ public class VisionForgeForNotebook(override val context: Context) : ContextAwar public fun stopServer() { engine?.apply { logger.info { "Stopping VisionForge server" } - }?.stop(1000, 2000) + stop(1000, 2000) + engine = null + server = null + } } private fun produceHtmlString( fragment: HtmlVisionFragment, - ): String = server?.serveVisionsFromFragment("content[${counter++}]", fragment) - ?: createHTML().apply { - visionFragment(context, fragment = fragment) - }.finalize() + ): String = createHTML().apply { + val server = server + val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" + div { + this.id = id + if (server != null) { + //if server exist, serve dynamically + server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) + } else { + //if not, use static rendering + visionFragment(context, fragment = fragment) + } + } + renderScriptForId(id) + }.finalize() public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = HTML(produceHtmlString(fragment), isolated ?: isolateFragments) diff --git a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt similarity index 66% rename from jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt rename to jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt index 944f1493..c8f6831d 100644 --- a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt @@ -1,8 +1,7 @@ package space.kscience.visionforge.jupyter -import kotlinx.html.p +import kotlinx.html.* import kotlinx.html.stream.createHTML -import kotlinx.html.style import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration @@ -11,11 +10,16 @@ import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.Vision import space.kscience.visionforge.html.* +import kotlin.random.Random +import kotlin.random.nextUInt +/** + * A base class for different Jupyter VF integrations + */ @DFExperimental -public abstract class JupyterPluginBase(final override val context: Context) : JupyterIntegration(), ContextAware { +public abstract class VFIntegrationBase(final override val context: Context) : JupyterIntegration(), ContextAware { - protected val handler: VisionForgeForNotebook = VisionForgeForNotebook(context) + protected val handler: VFForNotebook = VFForNotebook(context) protected abstract fun Builder.afterLoaded() @@ -50,7 +54,24 @@ public abstract class JupyterPluginBase(final override val context: Context) : J } render { page -> - HTML(page.render(createHTML()), true) + HTML(createHTML().apply { + head { + meta { + charset = "utf-8" + } + page.pageHeaders.values.forEach { + fragment(it) + } + } + body { + val id = "fragment[${page.hashCode()}/${Random.nextUInt()}]" + div { + this.id = id + visionFragment(context, fragment = page.content) + } + renderScriptForId(id) + } + }.finalize(), true) } render { fragment -> diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 0a112ba2..0f430053 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -5,11 +5,11 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.jupyter.JupyterPluginBase +import space.kscience.visionforge.jupyter.VFIntegrationBase import space.kscience.visionforge.solid.Solids @DFExperimental -internal class GdmlForJupyter : JupyterPluginBase( +internal class GdmlForJupyter : VFIntegrationBase( Context("GDML") { plugin(Solids) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 5a4395af..e8c91b1e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -8,8 +8,6 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import kotlin.random.Random -import kotlin.random.nextUInt public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit @@ -17,9 +15,6 @@ public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content -internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" - - /** * Render a fragment in the given consumer and return a map of extracted visions * @param context a context used to create a vision fragment @@ -35,7 +30,6 @@ public fun TagConsumer<*>.visionFragment( fetchDataUrl: String? = null, fetchUpdatesUrl: String? = null, idPrefix: String? = null, - renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() @@ -63,19 +57,9 @@ public fun TagConsumer<*>.visionFragment( } } } - if (renderScript) { - val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" - div { - this.id = id - fragment(consumer) - } - script { - type = "text/javascript" - unsafe { +"window.${RENDER_FUNCTION_NAME}(\"$id\");" } - } - } else { - fragment(consumer) - } + + fragment(consumer) + return visionMap } @@ -83,16 +67,14 @@ public fun FlowContent.visionFragment( context: Context = Global, embedData: Boolean = true, fetchDataUrl: String? = null, - fetchUpdatesUrl: String? = null, + flowDataUrl: String? = null, idPrefix: String? = null, - renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map = consumer.visionFragment( context, embedData, fetchDataUrl, - fetchUpdatesUrl, + flowDataUrl, idPrefix, - renderScript, fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt index cb284b14..1f297abe 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt @@ -13,20 +13,6 @@ public data class VisionPage( public val pageHeaders: Map = emptyMap(), public val content: HtmlVisionFragment, ) { - public fun render(root: TagConsumer): R = root.apply { - head { - meta { - charset = "utf-8" - } - pageHeaders.values.forEach { - fragment(it) - } - } - body { - visionFragment(context, fragment = content) - } - }.finalize() - public companion object{ /** * Use a script with given [src] as a global header for all pages. diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt index 5e1e2470..85ead127 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge import kotlinx.browser.document import kotlinx.coroutines.CoroutineScope -import kotlinx.dom.hasClass +import org.w3c.dom.Document import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @@ -36,7 +36,7 @@ public interface Application: CoroutineScope { * Starting point for an application. * @param state Initial state between Hot Module Replacement (HMR). */ - public fun start(state: Map) + public fun start(document: Document, state: Map) /** * Ending point for an application. @@ -46,17 +46,13 @@ public interface Application: CoroutineScope { } public fun startApplication(builder: () -> Application) { - fun start(state: dynamic): Application? { - return if (document.body?.hasClass("application") == true) { - val application = builder() + fun start(document: Document, state: dynamic): Application{ + val application = builder() - @Suppress("UnsafeCastFromDynamic") - application.start(state?.appState ?: emptyMap()) + @Suppress("UnsafeCastFromDynamic") + application.start(document, state?.appState ?: emptyMap()) - application - } else { - null - } + return application } var application: Application? = null @@ -73,9 +69,9 @@ public fun startApplication(builder: () -> Application) { } if (document.body != null) { - application = start(state) + application = start(document, state) } else { application = null - document.addEventListener("DOMContentLoaded", { application = start(state) }) + document.addEventListener("DOMContentLoaded", { application = start(document, state) }) } } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index f54b7d5d..a84a5a42 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -13,7 +13,6 @@ import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name -import space.kscience.visionforge.html.RENDER_FUNCTION_NAME import space.kscience.visionforge.html.VisionTagConsumer import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOINT_ATTRIBUTE @@ -46,18 +45,16 @@ public class VisionClient : AbstractPlugin() { return attribute?.value } - private fun getRenderers() = context.gather(ElementVisionRenderer.TYPE).values + private val renderers by lazy { context.gather(ElementVisionRenderer.TYPE).values } - private fun findRendererFor(vision: Vision): ElementVisionRenderer? { - return getRenderers().mapNotNull { - val rating = it.rateVision(vision) - if (rating > 0) { - rating to it - } else { - null - } - }.maxByOrNull { it.first }?.second - } + private fun findRendererFor(vision: Vision): ElementVisionRenderer? = renderers.mapNotNull { + val rating = it.rateVision(vision) + if (rating > 0) { + rating to it + } else { + null + } + }.maxByOrNull { it.first }?.second private fun Element.getEmbeddedData(className: String): String? = getElementsByClassName(className)[0]?.innerHTML @@ -78,7 +75,7 @@ public class VisionClient : AbstractPlugin() { if (vision != null) { vision.setAsRoot(visionManager) val renderer = findRendererFor(vision) - ?: error("Could not find renderer for ${visionManager.encodeToString(vision)}") + ?: error("Could not find renderer for ${vision::class}") renderer.render(element, vision, outputMeta) element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> @@ -228,7 +225,7 @@ public class VisionClient : AbstractPlugin() { private fun whenDocumentLoaded(block: Document.() -> Unit): Unit { - if (document.readyState == DocumentReadyState.COMPLETE) { + if (document.body != null) { block(document) } else { document.addEventListener("DOMContentLoaded", { block(document) }) @@ -267,14 +264,29 @@ public fun VisionClient.renderAllVisions(): Unit = whenDocumentLoaded { renderAllVisionsIn(element) } +public class VisionClientApplication(public val context: Context) : Application { + private val client = context.fetch(VisionClient) + + override fun start(document: Document, state: Map) { + console.info("Starting Vision Client") + val element = document.body ?: error("Document does not have a body") + client.renderAllVisionsIn(element) + } +} + + /** * Create a vision client context and render all visions on the page. */ public fun runVisionClient(contextBuilder: ContextBuilder.() -> Unit) { console.info("Starting VisionForge context") - val context = Context("VisionForge", contextBuilder) - val visionClient = context.fetch(VisionClient) - window.asDynamic()[RENDER_FUNCTION_NAME] = visionClient::renderAllVisionsById - //visionClient.renderAllVisions() + val context = Context("VisionForge") { + plugin(VisionClient) + contextBuilder() + } + + startApplication { + VisionClientApplication(context) + } } \ No newline at end of file diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index b3063eb1..223a9473 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -1,9 +1,14 @@ package space.kscience.visionforge +import kotlinx.html.body +import kotlinx.html.head +import kotlinx.html.meta import kotlinx.html.stream.createHTML import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.visionFragment import java.awt.Desktop import java.nio.file.Files import java.nio.file.Path @@ -56,20 +61,34 @@ import java.nio.file.Path /** * Export a [VisionPage] to a file + * + * @param fileHeaders additional file-system specific headers. */ @DFExperimental public fun VisionPage.makeFile( path: Path?, - defaultHeaders: ((Path) -> Map)? = null, + fileHeaders: ((Path) -> Map)? = null, ): Path { val actualFile = path?.let { Path.of(System.getProperty("user.home")).resolve(path) } ?: Files.createTempFile("tempPlot", ".html") - val actualDefaultHeaders = defaultHeaders?.invoke(actualFile) - val actualPage = if (actualDefaultHeaders == null) this else copy(pageHeaders = actualDefaultHeaders + pageHeaders) + val actualDefaultHeaders = fileHeaders?.invoke(actualFile) + val actualHeaders = if (actualDefaultHeaders == null) pageHeaders else actualDefaultHeaders + pageHeaders - val htmlString = actualPage.render(createHTML()) + val htmlString = createHTML().apply { + head { + meta { + charset = "utf-8" + } + actualHeaders.values.forEach { + fragment(it) + } + } + body { + visionFragment(context, fragment = content) + } + }.finalize() Files.writeString(actualFile, htmlString) return actualFile diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 364d3162..a4bfa7b9 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -115,7 +115,7 @@ public class VisionServer internal constructor( context = visionManager.context, embedData = dataMode == DataServeMode.EMBED, fetchDataUrl = if (dataMode != DataServeMode.EMBED) "$serverUrl$pagePath/data" else null, - fetchUpdatesUrl = if (dataMode == DataServeMode.UPDATE) "$serverUrl$pagePath/ws" else null, + flowDataUrl = if (dataMode == DataServeMode.UPDATE) "$serverUrl$pagePath/ws" else null, fragment = visionFragment ) } @@ -192,18 +192,19 @@ public class VisionServer internal constructor( * Compile a fragment to string and serve visions from it */ public fun serveVisionsFromFragment( + consumer: TagConsumer<*>, route: String, fragment: HtmlVisionFragment, - ): String = createHTML().apply { - val visions = visionFragment( + ): Unit { + val visions = consumer.visionFragment( visionManager.context, embedData = true, fetchUpdatesUrl = "$serverUrl$route/ws", - renderScript = true, fragment = fragment ) + serveVisions(route, visions) - }.finalize() + } /** * Serve a page, potentially containing any number of visions at a given [route] with given [header]. @@ -248,7 +249,11 @@ public class VisionServer internal constructor( title: String = "VisionForge server page '$route'", visionFragment: HtmlVisionFragment, ) { - page(route, mapOf("title" to VisionPage.title(title)) + headers.associateBy { it.hashCode().toString() }, visionFragment) + page( + route, + mapOf("title" to VisionPage.title(title)) + headers.associateBy { it.hashCode().toString() }, + visionFragment + ) } /** -- 2.34.1 From b2624cb10b83c43903638d3365741aba3ca941a1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 20 Nov 2022 20:28:16 +0300 Subject: [PATCH 102/143] Fix API --- .../space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt | 4 ++-- demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index ab2b35e0..e2d7ad51 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.gdml.demo -import kotlinx.browser.document import kotlinx.css.* +import org.w3c.dom.Document import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch @@ -20,7 +20,7 @@ import styled.injectGlobal private class GDMLDemoApp : Application { - override fun start(state: Map) { + override fun start(document: Document, state: Map) { val context = Context("gdml-demo"){ plugin(ThreePlugin) } diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 1ee7e013..2c93d31f 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,5 +1,5 @@ -import kotlinx.browser.document import kotlinx.css.* +import org.w3c.dom.Document import react.dom.client.createRoot import ringui.SmartTabs import ringui.Tab @@ -30,7 +30,7 @@ fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? private class JsPlaygroundApp : Application { - override fun start(state: Map) { + override fun start(document: Document, state: Map) { val playgroundContext = Context { plugin(ThreeWithControlsPlugin) -- 2.34.1 From 279b84803912dcabadf17be13280219fa8123e94 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 20 Nov 2022 20:35:36 +0300 Subject: [PATCH 103/143] Add demo notebook --- .gitignore | 1 + demo/playground/notebooks/demo3D.ipynb | 339 ------------------- demo/playground/notebooks/dynamic-demo.ipynb | 91 +++++ 3 files changed, 92 insertions(+), 339 deletions(-) delete mode 100644 demo/playground/notebooks/demo3D.ipynb create mode 100644 demo/playground/notebooks/dynamic-demo.ipynb diff --git a/.gitignore b/.gitignore index 6d07da58..44f45e0e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ data/ !gradle-wrapper.jar /kotlin-js-store/yarn.lock +. diff --git a/demo/playground/notebooks/demo3D.ipynb b/demo/playground/notebooks/demo3D.ipynb deleted file mode 100644 index 1efcd3c5..00000000 --- a/demo/playground/notebooks/demo3D.ipynb +++ /dev/null @@ -1,339 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "is_executing": true - }, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "@file:DependsOn(\"../build/libs/playground-0.3.0-dev-4-all.jar\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

Starting VisionForge server on http://localhost:7777

\n" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vf.startServer()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "\n" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import kotlinx.coroutines.*\n", - "import kotlin.random.Random\n", - "\n", - "Plotly.plot{\n", - " scatter{\n", - " x(1,2,3)\n", - " y(1,2,3)\n", - " if(vf.isServerRunning()){\n", - " vf.launch{\n", - " while(isActive){\n", - " delay(500)\n", - " y(Random.nextDouble(), Random.nextDouble(), Random.nextDouble())\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vf.stopServer()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Kotlin", - "language": "kotlin", - "name": "kotlin" - }, - "language_info": { - "codemirror_mode": "text/x-kotlin", - "file_extension": ".kt", - "mimetype": "text/x-kotlin", - "name": "kotlin", - "nbconvert_exporter": "", - "pygments_lexer": "kotlin", - "version": "1.8.0-dev-3517" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/demo/playground/notebooks/dynamic-demo.ipynb b/demo/playground/notebooks/dynamic-demo.ipynb new file mode 100644 index 00000000..ff7ca7ea --- /dev/null +++ b/demo/playground/notebooks/dynamic-demo.ipynb @@ -0,0 +1,91 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + }, + "tags": [] + }, + "outputs": [], + "source": [ + "@file:DependsOn(\"../build/libs/playground-0.3.0-dev-4-all.jar\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vf.startServer()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "import kotlinx.coroutines.*\n", + "import kotlin.random.Random\n", + "\n", + "Plotly.plot{\n", + " scatter{\n", + " x(1,2,3)\n", + " y(1,2,3)\n", + " if(vf.isServerRunning()){\n", + " vf.launch{\n", + " while(isActive){\n", + " delay(500)\n", + " y(Random.nextDouble(), Random.nextDouble(), Random.nextDouble())\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vf.stopServer()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "codemirror_mode": "text/x-kotlin", + "file_extension": ".kt", + "mimetype": "text/x-kotlin", + "name": "kotlin", + "nbconvert_exporter": "", + "pygments_lexer": "kotlin", + "version": "1.8.0-dev-3517" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} -- 2.34.1 From 4ceffef67a02f23f9739cb3d45c6dd818e5cd373 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 21 Nov 2022 13:28:39 +0300 Subject: [PATCH 104/143] Update connection logic --- demo/playground/notebooks/dynamic-demo.ipynb | 4 +- .../kscience/visionforge/VisionChange.kt | 11 +- .../kscience/visionforge/VisionClient.kt | 168 ++++++++++-------- 3 files changed, 102 insertions(+), 81 deletions(-) diff --git a/demo/playground/notebooks/dynamic-demo.ipynb b/demo/playground/notebooks/dynamic-demo.ipynb index ff7ca7ea..7200d15b 100644 --- a/demo/playground/notebooks/dynamic-demo.ipynb +++ b/demo/playground/notebooks/dynamic-demo.ipynb @@ -4,10 +4,10 @@ "cell_type": "code", "execution_count": null, "metadata": { + "tags": [], "pycharm": { "is_executing": true - }, - "tags": [] + } }, "outputs": [], "source": [ diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index e95dbd1b..1fbc33bc 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -148,9 +148,12 @@ private fun CoroutineScope.collectChange( /** * Generate a flow of changes of this vision and its children + * + * @param sendInitial if true, send the initial vision state as first change */ public fun Vision.flowChanges( collectionDuration: Duration, + sendInitial: Boolean = false ): Flow = flow { val manager = manager ?: error("Orphan vision could not collect changes") coroutineScope { @@ -158,9 +161,11 @@ public fun Vision.flowChanges( val mutex = Mutex() collectChange(Name.EMPTY, this@flowChanges, mutex, collector) - //Send initial vision state - val initialChange = VisionChange(vision = deepCopy(manager)) - emit(initialChange) + if(sendInitial) { + //Send initial vision state + val initialChange = VisionChange(vision = deepCopy(manager)) + emit(initialChange) + } while (true) { //Wait for changes to accumulate diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index a84a5a42..81655335 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -45,7 +45,7 @@ public class VisionClient : AbstractPlugin() { return attribute?.value } - private val renderers by lazy { context.gather(ElementVisionRenderer.TYPE).values } + internal val renderers by lazy { context.gather(ElementVisionRenderer.TYPE).values } private fun findRendererFor(vision: Vision): ElementVisionRenderer? = renderers.mapNotNull { val rating = it.rateVision(vision) @@ -71,76 +71,77 @@ public class VisionClient : AbstractPlugin() { changeCollector.setChild(name, child) } - private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { - if (vision != null) { - vision.setAsRoot(visionManager) - val renderer = findRendererFor(vision) - ?: error("Could not find renderer for ${vision::class}") - renderer.render(element, vision, outputMeta) + private fun renderVision(element: Element, vision: Vision, outputMeta: Meta) { + vision.setAsRoot(visionManager) + val renderer = findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") + renderer.render(element, vision, outputMeta) + } - element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> - val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { - val endpoint = resolveEndpoint(element) - logger.info { "Vision server is resolved to $endpoint" } - URL(endpoint).apply { - pathname += "/ws" + private fun updateVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { + element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> + val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { + val endpoint = resolveEndpoint(element) + logger.info { "Vision server is resolved to $endpoint" } + URL(endpoint).apply { + pathname += "/ws" + } + } else { + URL(attr.value) + }.apply { + protocol = "ws" + searchParams.append("name", name) + } + + logger.info { "Updating vision data from $wsUrl" } + + //Individual websocket for this element + WebSocket(wsUrl.toString()).apply { + onmessage = { messageEvent -> + val stringData: String? = messageEvent.data as? String + if (stringData != null) { + val change: VisionChange = visionManager.jsonFormat.decodeFromString( + VisionChange.serializer(), + stringData + ) + + // If change contains root vision replacement, do it + change.vision?.let { vision -> + renderVision(element, vision, outputMeta) + } + + logger.debug { "Got update $change for output with name $name" } + if (vision == null) error("Can't update vision because it is not loaded.") + vision.update(change) + } else { + logger.error { "WebSocket message data is not a string" } } - } else { - URL(attr.value) - }.apply { - protocol = "ws" - searchParams.append("name", name) } - logger.info { "Updating vision data from $wsUrl" } - //Individual websocket for this element - WebSocket(wsUrl.toString()).apply { - onmessage = { messageEvent -> - val stringData: String? = messageEvent.data as? String - if (stringData != null) { - val change: VisionChange = visionManager.jsonFormat.decodeFromString( - VisionChange.serializer(), - stringData - ) + //Backward change propagation + var feedbackJob: Job? = null - if (change.vision != null) { - renderer.render(element, vision, outputMeta) - } + //Feedback changes aggregation time in milliseconds + val feedbackAggregationTime = meta["aggregationTime"]?.int ?: 300 - logger.debug { "Got update $change for output with name $name" } - vision.update(change) - } else { - console.error("WebSocket message data is not a string") + onopen = { + feedbackJob = visionManager.context.launch { + delay(feedbackAggregationTime.milliseconds) + if (!changeCollector.isEmpty()) { + send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) + changeCollector.reset() } } + logger.info { "WebSocket update channel established for output '$name'" } + } - - //Backward change propagation - var feedbackJob: Job? = null - - //Feedback changes aggregation time in milliseconds - val feedbackAggregationTime = meta["aggregationTime"]?.int ?: 300 - - onopen = { - feedbackJob = visionManager.context.launch { - delay(feedbackAggregationTime.milliseconds) - if (!changeCollector.isEmpty()) { - send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) - changeCollector.reset() - } - } - console.info("WebSocket update channel established for output '$name'") - } - - onclose = { - feedbackJob?.cancel() - console.info("WebSocket update channel closed for output '$name'") - } - onerror = { - feedbackJob?.cancel() - console.error("WebSocket update channel error for output '$name'") - } + onclose = { + feedbackJob?.cancel() + logger.info { "WebSocket update channel closed for output '$name'" } + } + onerror = { + feedbackJob?.cancel() + logger.error { "WebSocket update channel error for output '$name'" } } } } @@ -164,17 +165,8 @@ public class VisionClient : AbstractPlugin() { VisionManager.defaultJson.decodeFromString(MetaSerializer, it) } ?: Meta.EMPTY - //Trying to render embedded vision - val embeddedVision = element.getEmbeddedData(VisionTagConsumer.OUTPUT_DATA_CLASS)?.let { - visionManager.decodeFromString(it) - } - when { - embeddedVision != null -> { - logger.info { "Found embedded vision for output with name $name" } - renderVision(name, element, embeddedVision, outputMeta) - } - + // fetch data if path is provided element.attributes[OUTPUT_FETCH_ATTRIBUTE] != null -> { val attr = element.attributes[OUTPUT_FETCH_ATTRIBUTE]!! @@ -195,7 +187,8 @@ public class VisionClient : AbstractPlugin() { if (response.ok) { response.text().then { text -> val vision = visionManager.decodeFromString(text) - renderVision(name, element, vision, outputMeta) + renderVision(element, vision, outputMeta) + updateVision(name, element, vision, outputMeta) } } else { logger.error { "Failed to fetch initial vision state from $fetchUrl" } @@ -203,6 +196,22 @@ public class VisionClient : AbstractPlugin() { } } + // use embedded data if it is available + element.getElementsByClassName(VisionTagConsumer.OUTPUT_DATA_CLASS).length > 0 -> { + //Getting embedded vision data + val embeddedVision = element.getEmbeddedData(VisionTagConsumer.OUTPUT_DATA_CLASS)!!.let { + visionManager.decodeFromString(it) + } + logger.info { "Found embedded vision for output with name $name" } + renderVision(element, embeddedVision, outputMeta) + updateVision(name, element, embeddedVision, outputMeta) + } + + //Try to load vision via websocket + element.attributes[OUTPUT_CONNECT_ATTRIBUTE] != null -> { + updateVision(name, element, null, outputMeta) + } + else -> error("No embedded vision data / fetch url for $name") } element.setAttribute(OUTPUT_RENDERED, "true") @@ -237,7 +246,7 @@ private fun whenDocumentLoaded(block: Document.() -> Unit): Unit { */ public fun VisionClient.renderAllVisionsIn(element: Element) { val elements = element.getElementsByClassName(VisionTagConsumer.OUTPUT_CLASS) - console.info("Finished search for outputs. Found ${elements.length} items") + logger.info { "Finished search for outputs. Found ${elements.length} items" } elements.asList().forEach { child -> renderVisionIn(child) } @@ -251,7 +260,7 @@ public fun VisionClient.renderAllVisionsById(id: String): Unit = whenDocumentLoa if (element != null) { renderAllVisionsIn(element) } else { - console.warn("Element with id $id not found") + logger.warn { "Element with id $id not found" } } } @@ -268,7 +277,14 @@ public class VisionClientApplication(public val context: Context) : Application private val client = context.fetch(VisionClient) override fun start(document: Document, state: Map) { - console.info("Starting Vision Client") + context.logger.info { + "Starting VisionClient with renderers: ${ + client.renderers.joinToString( + prefix = "\n\t", + separator = "\n\t" + ) { it.name.toString() } + }" + } val element = document.body ?: error("Document does not have a body") client.renderAllVisionsIn(element) } @@ -279,7 +295,7 @@ public class VisionClientApplication(public val context: Context) : Application * Create a vision client context and render all visions on the page. */ public fun runVisionClient(contextBuilder: ContextBuilder.() -> Unit) { - console.info("Starting VisionForge context") + Global.logger.info { "Starting VisionForge context" } val context = Context("VisionForge") { plugin(VisionClient) -- 2.34.1 From d6c974fcbc2d35e73e44c5e5ab02c3f76e6cb67e Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 23 Nov 2022 13:41:36 +0300 Subject: [PATCH 105/143] Fix loading duplicating plugins in visionServer --- .../kscience/visionforge/VisionContainer.kt | 18 +++++++++--------- .../visionforge/server/VisionServer.kt | 17 ++++++++++------- .../visionforge/solid/SolidReference.kt | 4 ++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 975e170a..7ac01b74 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -24,7 +24,7 @@ public interface MutableVisionContainer { * A serializable representation of [Vision] children container */ public interface VisionChildren : VisionContainer { - public val group: Vision? + public val parent: Vision? public val keys: Set @@ -35,7 +35,7 @@ public interface VisionChildren : VisionContainer { public operator fun get(token: NameToken): Vision? override fun getChild(name: Name): Vision? = when (name.length) { - 0 -> group + 0 -> parent 1 -> get(name.first()) else -> get(name.first())?.children?.getChild(name.cutFirst()) } @@ -44,7 +44,7 @@ public interface VisionChildren : VisionContainer { public const val STATIC_TOKEN_BODY: String = "@static" public fun empty(owner: Vision): VisionChildren = object : VisionChildren { - override val group: Vision get() = owner + override val parent: Vision get() = owner override val keys: Set get() = emptySet() override val changes: Flow get() = emptyFlow() override fun get(token: NameToken): Vision? = null @@ -64,7 +64,7 @@ public inline fun VisionChildren.forEach(block: (NameToken, Vision) -> Unit) { public interface MutableVisionChildren : VisionChildren, MutableVisionContainer { - public override val group: MutableVisionGroup + public override val parent: MutableVisionGroup public operator fun set(token: NameToken, value: Vision?) @@ -85,7 +85,7 @@ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer< else -> { val currentParent = get(name.first()) if (currentParent != null && currentParent !is MutableVisionGroup) error("Can't assign a child to $currentParent") - val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: group.createGroup().also { + val parent: MutableVisionGroup = currentParent as? MutableVisionGroup ?: parent.createGroup().also { set(name.first(), it) } parent.children.setChild(name.cutFirst(), child) @@ -125,7 +125,7 @@ public fun MutableVisionContainer.setChild( ): Unit = setChild(str?.parseAsName(), vision) internal abstract class VisionChildrenImpl( - override val group: MutableVisionGroup, + override val parent: MutableVisionGroup, ) : MutableVisionChildren { private val updateJobs = HashMap() @@ -140,7 +140,7 @@ internal abstract class VisionChildrenImpl( return items!! } - private val scope: CoroutineScope? get() = group.manager?.context + private val scope: CoroutineScope? get() = parent.manager?.context override val keys: Set get() = items?.keys ?: emptySet() @@ -170,9 +170,9 @@ internal abstract class VisionChildrenImpl( } else { (items ?: buildItems())[token] = value //check if parent already exists and is different from the current one - if (value.parent != null && value.parent != group) error("Can't reassign parent Vision for $value") + if (value.parent != null && value.parent != parent) error("Can't reassign parent Vision for $value") //set parent - value.parent = group + value.parent = parent //start update jobs (only if the vision is rooted) scope?.let { scope -> val job = value.children?.changes?.onEach { diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index a4bfa7b9..d806c278 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,10 +1,7 @@ package space.kscience.visionforge.server import io.ktor.http.* -import io.ktor.server.application.Application -import io.ktor.server.application.call -import io.ktor.server.application.install -import io.ktor.server.application.log +import io.ktor.server.application.* import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.embeddedServer @@ -18,6 +15,7 @@ import io.ktor.server.routing.* import io.ktor.server.util.getOrFail import io.ktor.server.websocket.WebSockets import io.ktor.server.websocket.webSocket +import io.ktor.util.pipeline.Pipeline import io.ktor.websocket.Frame import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect @@ -270,6 +268,11 @@ public class VisionServer internal constructor( } } +public fun

, B : Any, F : Any> P.require( + plugin: Plugin, + configure: B.() -> Unit = {}, +): F = pluginOrNull(plugin) ?: install(plugin, configure) + /** * Attach VisionForge server application to given server */ @@ -278,8 +281,8 @@ public fun Application.visionServer( webServerUrl: Url, path: String = DEFAULT_PAGE, ): VisionServer { - install(WebSockets) - install(CORS) { + require(WebSockets) + require(CORS) { anyHost() } @@ -287,7 +290,7 @@ public fun Application.visionServer( // install(CallLogging) // } - val serverRoute = install(Routing).createRouteFromPath(path) + val serverRoute = require(Routing).createRouteFromPath(path) serverRoute { static { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index b54e3ab6..80db0b3e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -124,7 +124,7 @@ public class SolidReference( override val children: VisionChildren get() = object : VisionChildren { - override val group: Vision get() = this@SolidReference + override val parent: Vision get() = this@SolidReference override val keys: Set get() = prototype.children?.keys ?: emptySet() @@ -198,7 +198,7 @@ internal class SolidReferenceChild( override val children: VisionChildren = object : VisionChildren { - override val group: Vision get() = this@SolidReferenceChild + override val parent: Vision get() = this@SolidReferenceChild override val keys: Set get() = prototype.children?.keys ?: emptySet() -- 2.34.1 From 20b20a621f5145137aebb845a67fe608ac98925d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 2 Dec 2022 22:38:37 +0300 Subject: [PATCH 106/143] Refactor server API --- build.gradle.kts | 2 +- .../src/jvmMain/kotlin/formServer.kt | 82 ++-- .../src/jvmMain/kotlin/serverExtensions.kt | 3 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 29 +- jupyter/src/jvmMain/kotlin/VFForNotebook.kt | 69 ++- .../src/jvmMain/kotlin/VFIntegrationBase.kt | 4 +- .../visionforge/html/HtmlVisionRenderer.kt | 50 +- .../kscience/visionforge/html/VisionPage.kt | 4 +- .../visionforge/html/VisionTagConsumer.kt | 46 +- .../visionforge/html/HtmlVisionContext.kt | 29 +- .../kscience/visionforge/html/htmlExport.kt | 3 +- .../visionforge/server/VisionServer.kt | 431 +++++++----------- .../kscience/visionforge/solid/Solids.kt | 2 +- .../visionforge/three/serverExtensions.kt | 3 +- 14 files changed, 381 insertions(+), 376 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b5e3fd7e..5a82b18c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-4" + version = "0.3.0-dev-5" } subprojects { diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 4d60a423..4b63b569 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -1,5 +1,8 @@ package space.kscience.visionforge.examples +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.routing.routing import kotlinx.html.* import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch @@ -9,51 +12,54 @@ import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser -import space.kscience.visionforge.server.serve +import space.kscience.visionforge.server.visionPage fun main() { val visionManager = Global.fetch(VisionManager) - val server = visionManager.serve { - page(VisionPage.scriptHeader("js/visionforge-playground.js")) { - val form = formFragment("form") { - label { - htmlFor = "fname" - +"First name:" - } - br() - input { - type = InputType.text - id = "fname" - name = "fname" - value = "John" - } - br() - label { - htmlFor = "lname" - +"Last name:" - } - br() - input { - type = InputType.text - id = "lname" - name = "lname" - value = "Doe" - } - br() - br() - input { - type = InputType.submit - value = "Submit" - } - } + val server = embeddedServer(CIO, 7777, "localhost") { - vision("form") { form } - form.onPropertyChange { - println(this) + routing { + visionPage(visionManager, VisionPage.scriptHeader("js/visionforge-playground.js")) { + val form = formFragment("form") { + label { + htmlFor = "fname" + +"First name:" + } + br() + input { + type = InputType.text + id = "fname" + name = "fname" + value = "John" + } + br() + label { + htmlFor = "lname" + +"Last name:" + } + br() + input { + type = InputType.text + id = "lname" + name = "lname" + value = "Doe" + } + br() + br() + input { + type = InputType.submit + value = "Submit" + } + } + + vision("form") { form } + form.onPropertyChange { + println(this) + } } } - } + }.start(false) server.openInBrowser() diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index eda8ba2b..a3bde8d6 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -6,6 +6,7 @@ import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.importScriptHeader import space.kscience.visionforge.makeFile +import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path @@ -16,7 +17,7 @@ public fun makeVisionFile( show: Boolean = true, content: HtmlVisionFragment, ): Unit { - val actualPath = VisionPage(Global, content = content).makeFile(path) { actualPath -> + val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> mapOf( "title" to VisionPage.title(title), "playground" to VisionPage.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 23699443..a55020a2 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -1,26 +1,28 @@ package ru.mipt.npm.sat +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.http.content.resources +import io.ktor.server.http.content.static +import io.ktor.server.routing.routing import kotlinx.coroutines.* import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Null -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser -import space.kscience.visionforge.server.serve +import space.kscience.visionforge.server.visionPage import space.kscience.visionforge.solid.* import space.kscience.visionforge.three.threeJsHeader -import space.kscience.visionforge.visionManager import kotlin.random.Random -@OptIn(DFExperimental::class) fun main() { val satContext = Context("sat") { plugin(Solids) @@ -35,14 +37,21 @@ fun main() { } } - val server = satContext.visionManager.serve { - page(VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css")) { - div("flex-column") { - h1 { +"Satellite detector demo" } - vision { sat } + val server = embeddedServer(CIO,7777, "localhost") { + routing { + + static { + resources() + } + + visionPage(solids.visionManager, VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css")) { + div("flex-column") { + h1 { +"Satellite detector demo" } + vision { sat } + } } } - } + }.start(false) server.openInBrowser() diff --git a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt index 4c7b4e29..c3b79734 100644 --- a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt @@ -1,6 +1,14 @@ package space.kscience.visionforge.jupyter +import io.ktor.http.URLProtocol +import io.ktor.server.application.install +import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine +import io.ktor.server.engine.embeddedServer +import io.ktor.server.routing.Routing +import io.ktor.server.routing.route +import io.ktor.server.util.url +import io.ktor.server.websocket.WebSockets import kotlinx.coroutines.CoroutineScope import kotlinx.html.* import kotlinx.html.stream.createHTML @@ -13,11 +21,14 @@ import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string +import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.HtmlFormFragment import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.VisionCollector import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.server.VisionServer -import space.kscience.visionforge.server.serve +import space.kscience.visionforge.server.VisionRouteConfiguration +import space.kscience.visionforge.server.require +import space.kscience.visionforge.server.serveVisionData import space.kscience.visionforge.visionManager import kotlin.coroutines.CoroutineContext import kotlin.random.Random @@ -34,10 +45,14 @@ internal fun TagConsumer<*>.renderScriptForId(id: String) { * A handler class that includes a server and common utilities */ public class VFForNotebook(override val context: Context) : ContextAware, CoroutineScope { + + public val visionManager: VisionManager = context.visionManager + + private val configuration = VisionRouteConfiguration(visionManager) + private var counter = 0 private var engine: ApplicationEngine? = null - private var server: VisionServer? = null public var isolateFragments: Boolean = false @@ -47,16 +62,15 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout isolateFragments = true } - public fun isServerRunning(): Boolean = server != null + public fun isServerRunning(): Boolean = engine != null public fun html(block: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(createHTML().apply(block).finalize()) public fun startServer( host: String = context.properties["visionforge.host"].string ?: "localhost", - port: Int = context.properties["visionforge.port"].int ?: VisionServer.DEFAULT_PORT, - configuration: VisionServer.() -> Unit = {}, + port: Int = context.properties["visionforge.port"].int ?: VisionRouteConfiguration.DEFAULT_PORT, ): MimeTypedResult = html { - if (server != null) { + if (engine != null) { p { style = "color: red;" +"Stopping current VisionForge server" @@ -64,10 +78,9 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout } engine?.stop(1000, 2000) - engine = context.visionManager.serve(host, port) { - configuration() - server = this - }.start() + engine = context.embeddedServer(CIO, port, host) { + install(WebSockets) + }.start(false) p { style = "color: blue;" @@ -80,20 +93,46 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout logger.info { "Stopping VisionForge server" } stop(1000, 2000) engine = null - server = null } } private fun produceHtmlString( fragment: HtmlVisionFragment, ): String = createHTML().apply { - val server = server val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" div { this.id = id - if (server != null) { + val engine = engine + if (engine != null) { //if server exist, serve dynamically - server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) + //server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) + val cellRoute = "content-${counter++}" + + val collector: VisionCollector = mutableMapOf() + + val url = engine.environment.connectors.first().let { + url{ + protocol = URLProtocol.WS + host = it.host + port = it.port + pathSegments = listOf(cellRoute, "ws") + } + } + + visionFragment( + context, + embedData = true, + updatesUrl = url, + collector = collector, + fragment = fragment + ) + + engine.application.require(Routing) { + route(cellRoute) { + serveVisionData(TODO(), collector) + } + } + } else { //if not, use static rendering visionFragment(context, fragment = fragment) diff --git a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt index c8f6831d..8aa9348a 100644 --- a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt +++ b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt @@ -48,7 +48,7 @@ public abstract class VFIntegrationBase(final override val context: Context) : J render { vision -> handler.produceHtml { - vision { vision } + vision(vision) } } @@ -83,7 +83,7 @@ public abstract class VFIntegrationBase(final override val context: Context) : J } } fragment(fragment.formBody) - vision { fragment.vision } + vision(fragment.vision) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index e8c91b1e..341c38ab 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -2,10 +2,11 @@ package space.kscience.visionforge.html import kotlinx.html.* import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager @@ -14,31 +15,48 @@ public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit @DFExperimental public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content +public typealias VisionCollector = MutableMap> + /** * Render a fragment in the given consumer and return a map of extracted visions * @param context a context used to create a vision fragment * @param embedData embed Vision initial state in the HTML * @param fetchDataUrl fetch data after first render from given url - * @param fetchUpdatesUrl receive push updates from the server at given url + * @param updatesUrl receive push updates from the server at given url * @param idPrefix a prefix to be used before vision ids - * @param renderScript if true add rendering script after the fragment */ public fun TagConsumer<*>.visionFragment( - context: Context = Global, + context: Context, embedData: Boolean = true, fetchDataUrl: String? = null, - fetchUpdatesUrl: String? = null, + updatesUrl: String? = null, idPrefix: String? = null, + collector: VisionCollector = mutableMapOf(), fragment: HtmlVisionFragment, -): Map { - val visionMap = HashMap() +) { val consumer = object : VisionTagConsumer(this@visionFragment, context, idPrefix) { + + override fun TagConsumer.vision(name: Name?, buildOutput: VisionOutput.() -> Vision): T { + //Avoid re-creating cached visions + val actualName = name ?: NameToken( + DEFAULT_VISION_NAME, + buildOutput.hashCode().toUInt().toString() + ).asName() + + val (output, vision) = collector.getOrPut(actualName) { + val output = VisionOutput(context, actualName) + val vision = output.buildOutput() + output to vision + } + + return addVision(actualName, output.visionManager, vision, output.meta) + } + override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { - visionMap[name] = vision // Toggle update mode - fetchUpdatesUrl?.let { + updatesUrl?.let { attributes[OUTPUT_CONNECT_ATTRIBUTE] = it } @@ -59,22 +77,22 @@ public fun TagConsumer<*>.visionFragment( } fragment(consumer) - - return visionMap } public fun FlowContent.visionFragment( - context: Context = Global, + context: Context, embedData: Boolean = true, fetchDataUrl: String? = null, - flowDataUrl: String? = null, + updatesUrl: String? = null, idPrefix: String? = null, + visionCache: VisionCollector = mutableMapOf(), fragment: HtmlVisionFragment, -): Map = consumer.visionFragment( +): Unit = consumer.visionFragment( context, embedData, fetchDataUrl, - flowDataUrl, + updatesUrl, idPrefix, - fragment + visionCache, + fragment = fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt index 1f297abe..de18ced5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.context.Context +import space.kscience.visionforge.VisionManager /** * A structure representing a single page with Visions to be rendered. @@ -9,7 +9,7 @@ import space.kscience.dataforge.context.Context * @param pageHeaders static headers for this page. */ public data class VisionPage( - public val context: Context, + public val visionManager: VisionManager, public val pageHeaders: Map = emptyMap(), public val content: HtmlVisionFragment, ) { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index df0b9391..6fc915ef 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.isEmpty -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName @@ -25,9 +24,8 @@ public annotation class VisionDSL /** * A placeholder object to attach inline vision builders. */ -@DFExperimental @VisionDSL -public class VisionOutput @PublishedApi internal constructor(public val context: Context, public val name: Name?) { +public class VisionOutput @PublishedApi internal constructor(public val context: Context, public val name: Name) { public var meta: Meta = Meta.EMPTY private val requirements: MutableSet> = HashSet() @@ -36,8 +34,8 @@ public class VisionOutput @PublishedApi internal constructor(public val context: requirements.add(factory) } - internal fun buildVisionManager(): VisionManager = - if (requirements.all { req -> context.plugins.find(true) { it.tag == req.tag } != null }) { + public val visionManager: VisionManager + get() = if (requirements.all { req -> context.plugins.find(true) { it.tag == req.tag } != null }) { context.visionManager } else { val newContext = context.buildContext(NameToken(DEFAULT_VISION_NAME, name.toString()).asName()) { @@ -56,7 +54,6 @@ public class VisionOutput @PublishedApi internal constructor(public val context: * Modified [TagConsumer] that allows rendering output fragments and visions in them */ @VisionDSL -@OptIn(DFExperimental::class) public abstract class VisionTagConsumer( private val root: TagConsumer, public val context: Context, @@ -78,12 +75,14 @@ public abstract class VisionTagConsumer( * Create a placeholder for a vision output with optional [Vision] in it * TODO with multi-receivers could be replaced by [VisionTagConsumer, TagConsumer] extension */ - private fun TagConsumer.vision( + protected fun TagConsumer.addVision( name: Name, manager: VisionManager, - vision: Vision, + vision: Vision?, outputMeta: Meta = Meta.EMPTY, - ): T = div { + ): T = if (vision == null) div { + +"Empty Vision output" + } else div { id = resolveId(name) classes = setOf(OUTPUT_CLASS) if (vision.parent == null) { @@ -106,26 +105,35 @@ public abstract class VisionTagConsumer( * Insert a vision in this HTML. * TODO replace by multi-receiver */ - @OptIn(DFExperimental::class) - public fun TagConsumer.vision( + @VisionDSL + public open fun TagConsumer.vision( name: Name? = null, - @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, + buildOutput: VisionOutput.() -> Vision, ): T { - val output = VisionOutput(context, name) - val vision = output.visionProvider() - val actualName = name ?: NameToken(DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() - return vision(actualName, output.buildVisionManager(), vision, output.meta) + val actualName = name ?: NameToken(DEFAULT_VISION_NAME, buildOutput.hashCode().toUInt().toString()).asName() + val output = VisionOutput(context, actualName) + val vision = output.buildOutput() + return addVision(actualName, output.visionManager, vision, output.meta) } /** * TODO to be replaced by multi-receiver */ - @OptIn(DFExperimental::class) @VisionDSL public fun TagConsumer.vision( name: String?, - @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, - ): T = vision(name?.parseAsName(), visionProvider) + buildOutput: VisionOutput.() -> Vision, + ): T = vision(name?.parseAsName(), buildOutput) + + @VisionDSL + public open fun TagConsumer.vision( + vision: Vision, + name: Name? = null, + outputMeta: Meta = Meta.EMPTY, + ) { + val actualName = name ?: NameToken(DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() + addVision(actualName, context.visionManager, vision, outputMeta) + } /** * Process the resulting object produced by [TagConsumer] diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt index 007658b1..7d82da49 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt @@ -5,13 +5,13 @@ import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.isEmpty -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.VisionTagConsumer.Companion.DEFAULT_VISION_NAME import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.visionManager @@ -34,11 +34,13 @@ public interface HtmlVisionContext : ContextAware { public typealias HtmlVisionContextFragment = context(HtmlVisionContext) TagConsumer<*>.() -> Unit -context(HtmlVisionContext) public fun HtmlVisionFragment( - content: TagConsumer<*>.() -> Unit +context(HtmlVisionContext) +public fun HtmlVisionFragment( + content: TagConsumer<*>.() -> Unit, ): HtmlVisionFragment = content -context(HtmlVisionContext) private fun TagConsumer.vision( +context(HtmlVisionContext) +private fun TagConsumer.vision( visionManager: VisionManager, name: Name, vision: Vision, @@ -61,7 +63,7 @@ context(HtmlVisionContext) private fun TagConsumer.vision( } context(HtmlVisionContext) - private fun TagConsumer.vision( +private fun TagConsumer.vision( name: Name, vision: Vision, outputMeta: Meta = Meta.EMPTY, @@ -71,26 +73,23 @@ context(HtmlVisionContext) * Insert a vision in this HTML. */ context(HtmlVisionContext) - @DFExperimental - @VisionDSL - public fun TagConsumer.vision( +@VisionDSL +public fun TagConsumer.vision( name: Name? = null, visionProvider: VisionOutput.() -> Vision, ): T { - val output = VisionOutput(context, name) + val actualName = name ?: NameToken(DEFAULT_VISION_NAME, visionProvider.hashCode().toUInt().toString()).asName() + val output = VisionOutput(context, actualName) val vision = output.visionProvider() - val actualName = - name ?: NameToken(VisionTagConsumer.DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() - return vision(output.buildVisionManager(), actualName, vision, output.meta) + return vision(output.visionManager, actualName, vision, output.meta) } /** * Insert a vision in this HTML. */ context(HtmlVisionContext) - @DFExperimental - @VisionDSL - public fun TagConsumer.vision( +@VisionDSL +public fun TagConsumer.vision( name: String?, visionProvider: VisionOutput.() -> Vision, ): T = vision(name?.parseAsName(), visionProvider) \ No newline at end of file diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index 223a9473..cba1ee31 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -4,6 +4,7 @@ import kotlinx.html.body import kotlinx.html.head import kotlinx.html.meta import kotlinx.html.stream.createHTML +import space.kscience.dataforge.context.Global import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.VisionPage @@ -86,7 +87,7 @@ public fun VisionPage.makeFile( } } body { - visionFragment(context, fragment = content) + visionFragment(Global, fragment = content) } }.finalize() diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index d806c278..2fe84660 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -2,39 +2,34 @@ package space.kscience.visionforge.server import io.ktor.http.* import io.ktor.server.application.* -import io.ktor.server.cio.CIO -import io.ktor.server.engine.ApplicationEngine -import io.ktor.server.engine.embeddedServer -import io.ktor.server.html.respondHtml -import io.ktor.server.http.content.resources -import io.ktor.server.http.content.static -import io.ktor.server.plugins.cors.routing.CORS -import io.ktor.server.response.respond -import io.ktor.server.response.respondText +import io.ktor.server.cio.* +import io.ktor.server.engine.* +import io.ktor.server.html.* +import io.ktor.server.http.content.* +import io.ktor.server.plugins.* +import io.ktor.server.plugins.cors.routing.* +import io.ktor.server.request.* +import io.ktor.server.response.* import io.ktor.server.routing.* -import io.ktor.server.util.getOrFail -import io.ktor.server.websocket.WebSockets -import io.ktor.server.websocket.webSocket -import io.ktor.util.pipeline.Pipeline -import io.ktor.websocket.Frame +import io.ktor.server.util.* +import io.ktor.server.websocket.* +import io.ktor.util.pipeline.* +import io.ktor.websocket.* import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* -import kotlinx.html.stream.createHTML +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges -import space.kscience.visionforge.html.HtmlFragment -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.server.VisionServer.Companion.DEFAULT_PAGE +import space.kscience.visionforge.html.* import java.awt.Desktop import java.net.URI import kotlin.time.Duration.Companion.milliseconds @@ -57,210 +52,20 @@ public enum class DataServeMode { UPDATE } -/** - * A ktor plugin container with given [routing] - * @param serverUrl a server url including root route - */ -public class VisionServer internal constructor( - private val visionManager: VisionManager, - private val serverUrl: Url, - private val root: Route, -) : Configurable { +public class VisionRouteConfiguration( + public val visionManager: VisionManager, + override val meta: ObservableMutableMeta = MutableMeta(), +) : Configurable, ContextAware { - public val application: Application get() = root.application - - override val meta: ObservableMutableMeta = MutableMeta() + override val context: Context get() = visionManager.context /** * Update minimal interval between updates in milliseconds (if there are no updates, push will not happen */ public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) - /** - * Cache page fragments. If false, pages will be reconstructed on each call. Default: `true` - */ - public var cacheFragments: Boolean by meta.boolean(true) - public var dataMode: DataServeMode by meta.enum(DataServeMode.UPDATE) - private val serverHeaders: MutableMap = mutableMapOf() - - /** - * Set up a default header that is automatically added to all pages on this server - */ - public fun header(key: String, block: HtmlFragment) { - serverHeaders[key] = block - } - - private fun HTML.visionPage( - pagePath: String, - headers: Map, - visionFragment: HtmlVisionFragment, - ): Map { - var visionMap: Map? = null - - head { - meta { - charset = "utf-8" - } - (serverHeaders + headers).values.forEach { - consumer.it() - } - } - body { - //Load the fragment and remember all loaded visions - visionMap = visionFragment( - context = visionManager.context, - embedData = dataMode == DataServeMode.EMBED, - fetchDataUrl = if (dataMode != DataServeMode.EMBED) "$serverUrl$pagePath/data" else null, - flowDataUrl = if (dataMode == DataServeMode.UPDATE) "$serverUrl$pagePath/ws" else null, - fragment = visionFragment - ) - } - - return visionMap!! - } - - /** - * Server a map of visions without providing explicit html page for them - */ - private fun serveVisions(route: Route, visions: Map): Unit = route { - application.log.info("Serving visions $visions at $route") - - //Update websocket - webSocket("ws") { - val name: String = call.request.queryParameters.getOrFail("name") - application.log.debug("Opened server socket for $name") - val vision: Vision = visions[Name.parse(name)] ?: error("Plot with id='$name' not registered") - - launch { - incoming.consumeEach { - val data = it.data.decodeToString() - application.log.debug("Received update: \n$data") - val change = visionManager.jsonFormat.decodeFromString( - VisionChange.serializer(), data - ) - vision.update(change) - } - } - - try { - withContext(visionManager.context.coroutineContext) { - vision.flowChanges(updateInterval.milliseconds).onEach { update -> - val json = visionManager.jsonFormat.encodeToString( - VisionChange.serializer(), - update - ) - application.log.debug("Sending update: \n$json") - outgoing.send(Frame.Text(json)) - }.collect() - } - } catch (t: Throwable) { - application.log.info("WebSocket update channel for $name is closed with exception: $t") - } - } - //Plots in their json representation - get("data") { - val name: String = call.request.queryParameters.getOrFail("name") - - val vision: Vision? = visions[Name.parse(name)] - if (vision == null) { - call.respond(HttpStatusCode.NotFound, "Vision with name '$name' not found") - } else { - call.respondText( - visionManager.encodeToString(vision), - contentType = ContentType.Application.Json, - status = HttpStatusCode.OK - ) - } - } - } - - - /** - * Serve visions in a given [route] without providing a page template - */ - public fun serveVisions(route: String, visions: Map) { - root.route(route) { - serveVisions(this, visions) - } - } - - /** - * Compile a fragment to string and serve visions from it - */ - public fun serveVisionsFromFragment( - consumer: TagConsumer<*>, - route: String, - fragment: HtmlVisionFragment, - ): Unit { - val visions = consumer.visionFragment( - visionManager.context, - embedData = true, - fetchUpdatesUrl = "$serverUrl$route/ws", - fragment = fragment - ) - - serveVisions(route, visions) - } - - /** - * Serve a page, potentially containing any number of visions at a given [route] with given [header]. - */ - public fun page( - route: String = DEFAULT_PAGE, - headers: Map, - visionFragment: HtmlVisionFragment, - ) { - val visions = HashMap() - - val cachedHtml: String? = if (cacheFragments) { - //Create and cache page html and map of visions - createHTML(true).html { - visions.putAll(visionPage(route, headers, visionFragment)) - } - } else { - null - } - - root.route(route) { - serveVisions(this, visions) - //filled pages - get { - if (cachedHtml == null) { - //re-create html and vision list on each call - call.respondHtml { - visions.clear() - visions.putAll(visionPage(route, headers, visionFragment)) - } - } else { - //Use cached html - call.respondText(cachedHtml, ContentType.Text.Html.withCharset(Charsets.UTF_8)) - } - } - } - } - - public fun page( - vararg headers: HtmlFragment, - route: String = DEFAULT_PAGE, - title: String = "VisionForge server page '$route'", - visionFragment: HtmlVisionFragment, - ) { - page( - route, - mapOf("title" to VisionPage.title(title)) + headers.associateBy { it.hashCode().toString() }, - visionFragment - ) - } - - /** - * Render given [VisionPage] at server - */ - public fun page(route: String, page: VisionPage) { - page(route = route, headers = page.pageHeaders, visionFragment = page.content) - } - public companion object { public const val DEFAULT_PORT: Int = 7777 public const val DEFAULT_PAGE: String = "/" @@ -268,50 +73,168 @@ public class VisionServer internal constructor( } } + +/** + * Serve visions in a given [route] without providing a page template. + * [visions] could be changed during the service. + */ +public fun Route.serveVisionData( + configuration: VisionRouteConfiguration, + resolveVision: (Name) -> Vision?, +) { + application.log.info("Serving visions at ${this@serveVisionData}") + + //Update websocket + webSocket("ws") { + val name: String = call.request.queryParameters.getOrFail("name") + application.log.debug("Opened server socket for $name") + val vision: Vision = resolveVision(Name.parse(name)) ?: error("Plot with id='$name' not registered") + + launch { + incoming.consumeEach { + val data = it.data.decodeToString() + application.log.debug("Received update: \n$data") + val change = configuration.visionManager.jsonFormat.decodeFromString( + VisionChange.serializer(), data + ) + vision.update(change) + } + } + + try { + withContext(configuration.context.coroutineContext) { + vision.flowChanges(configuration.updateInterval.milliseconds).onEach { update -> + val json = configuration.visionManager.jsonFormat.encodeToString( + VisionChange.serializer(), + update + ) + application.log.debug("Sending update: \n$json") + outgoing.send(Frame.Text(json)) + }.collect() + } + } catch (t: Throwable) { + this.application.log.info("WebSocket update channel for $name is closed with exception: $t") + } + } + //Plots in their json representation + get("data") { + val name: String = call.request.queryParameters.getOrFail("name") + + val vision: Vision? = resolveVision(Name.parse(name)) + if (vision == null) { + call.respond(HttpStatusCode.NotFound, "Vision with name '$name' not found") + } else { + call.respondText( + configuration.visionManager.encodeToString(vision), + contentType = ContentType.Application.Json, + status = HttpStatusCode.OK + ) + } + } +} + +public fun Route.serveVisionData( + configuration: VisionRouteConfiguration, + cache: VisionCollector, +): Unit = serveVisionData(configuration) { cache[it]?.second } +// +///** +// * Compile a fragment to string and serve visions from it +// */ +//public fun Route.serveVisionsFromFragment( +// consumer: TagConsumer<*>, +// sererPageUrl: Url, +// visionManager: VisionManager, +// fragment: HtmlVisionFragment, +//): Unit { +// val visions = consumer.visionFragment( +// visionManager.context, +// embedData = true, +// fetchUpdatesUrl = "$serverUrl$route/ws", +// fragment = fragment +// ) +// +// serveVisionData(visionManager, visions) +//} + + +/** + * Serve a page, potentially containing any number of visions at a given [route] with given [header]. + */ +public fun Route.visionPage( + configuration: VisionRouteConfiguration, + headers: Collection, + visionFragment: HtmlVisionFragment, +) { + application.require(WebSockets) + require(CORS) { + anyHost() + } + + val visionCache: VisionCollector = mutableMapOf() + serveVisionData(configuration, visionCache) + + //filled pages + get { + //re-create html and vision list on each call + call.respondHtml { + val callbackUrl = call.url() + head { + meta { + charset = "utf-8" + } + headers.forEach { header -> + consumer.header() + } + } + body { + //Load the fragment and remember all loaded visions + visionFragment( + context = configuration.context, + embedData = configuration.dataMode == DataServeMode.EMBED, + fetchDataUrl = if (configuration.dataMode != DataServeMode.EMBED) { + URLBuilder(callbackUrl).apply { + pathSegments = pathSegments + "data" + }.buildString() + } else null, + updatesUrl = if (configuration.dataMode == DataServeMode.UPDATE) { + URLBuilder(callbackUrl).apply { + protocol = URLProtocol.WS + pathSegments = pathSegments + "ws" + }.buildString() + } else null, + visionCache = visionCache, + fragment = visionFragment + ) + } + } + + } +} + +public fun Route.visionPage( + visionManager: VisionManager, + vararg headers: HtmlFragment, + configurationBuilder: VisionRouteConfiguration.() -> Unit = {}, + visionFragment: HtmlVisionFragment, +) { + val configuration = VisionRouteConfiguration(visionManager).apply(configurationBuilder) + visionPage(configuration, listOf(*headers), visionFragment) +} + +/** + * Render given [VisionPage] at server + */ +public fun Route.visionPage(page: VisionPage, configurationBuilder: VisionRouteConfiguration.() -> Unit = {}) { + val configuration = VisionRouteConfiguration(page.visionManager).apply(configurationBuilder) + visionPage(configuration, page.pageHeaders.values, visionFragment = page.content) +} + public fun

, B : Any, F : Any> P.require( plugin: Plugin, configure: B.() -> Unit = {}, ): F = pluginOrNull(plugin) ?: install(plugin, configure) -/** - * Attach VisionForge server application to given server - */ -public fun Application.visionServer( - visionManager: VisionManager, - webServerUrl: Url, - path: String = DEFAULT_PAGE, -): VisionServer { - require(WebSockets) - require(CORS) { - anyHost() - } - -// if (pluginOrNull(CallLogging) == null) { -// install(CallLogging) -// } - - val serverRoute = require(Routing).createRouteFromPath(path) - - serverRoute { - static { - resources() - } - } - - return VisionServer(visionManager, URLBuilder(webServerUrl).apply { encodedPath = path }.build(), serverRoute) -} - -/** - * Start a stand-alone VisionForge server at given host/port - */ -public fun VisionManager.serve( - host: String = "localhost", - port: Int = VisionServer.DEFAULT_PORT, - block: VisionServer.() -> Unit, -): ApplicationEngine = context.embeddedServer(CIO, port, host) { - val url = URLBuilder(host = host, port = port).build() - visionServer(this@serve, url).apply(block) -}.start() /** * Connect to a given Ktor server using browser diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 43640182..919ac4cd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -33,7 +33,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer = Solids::class public val default: Solids by lazy { - Context("@Solids"){ + Context("@Solids") { plugin(Solids) }.fetch(Solids) } diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt index 1261a0de..8f52ccf1 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -4,6 +4,7 @@ import space.kscience.dataforge.context.Global import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.* import space.kscience.visionforge.makeFile +import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path @@ -19,7 +20,7 @@ public fun makeThreeJsFile( show: Boolean = true, content: HtmlVisionFragment, ): Unit { - val actualPath = VisionPage(Global, content = content).makeFile(path) { actualPath -> + val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> mapOf( "title" to VisionPage.title(title), "threeJs" to VisionPage.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) -- 2.34.1 From c8141c633842b1aa16fffbcbede53e5a1aa5f7f1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Dec 2022 13:53:34 +0300 Subject: [PATCH 107/143] Refactor server API --- .../src/jvmMain/kotlin/formServer.kt | 80 +++--- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 20 +- jupyter/src/jvmMain/kotlin/VFForNotebook.kt | 24 +- .../visionforge/server/VisionServer.kt | 269 +++++++++--------- .../server/applicationExtensions.kt | 38 +++ 5 files changed, 240 insertions(+), 191 deletions(-) create mode 100644 visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 4b63b569..9e635dc9 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.examples import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer +import io.ktor.server.http.content.resources import io.ktor.server.routing.routing import kotlinx.html.* import space.kscience.dataforge.context.Global @@ -10,6 +11,7 @@ import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage @@ -17,48 +19,54 @@ import space.kscience.visionforge.server.visionPage fun main() { val visionManager = Global.fetch(VisionManager) - val server = embeddedServer(CIO, 7777, "localhost") { + + val connector = EngineConnectorConfig("localhost", 7777) + + val server = embeddedServer(CIO, connector.port, connector.host) { routing { - visionPage(visionManager, VisionPage.scriptHeader("js/visionforge-playground.js")) { - val form = formFragment("form") { - label { - htmlFor = "fname" - +"First name:" - } - br() - input { - type = InputType.text - id = "fname" - name = "fname" - value = "John" - } - br() - label { - htmlFor = "lname" - +"Last name:" - } - br() - input { - type = InputType.text - id = "lname" - name = "lname" - value = "Doe" - } - br() - br() - input { - type = InputType.submit - value = "Submit" - } - } + resources() + } - vision("form") { form } - form.onPropertyChange { - println(this) + visionPage(connector, visionManager, VisionPage.scriptHeader("js/visionforge-playground.js")) { + val form = formFragment("form") { + label { + htmlFor = "fname" + +"First name:" + } + br() + input { + type = InputType.text + id = "fname" + name = "fname" + value = "John" + } + br() + label { + htmlFor = "lname" + +"Last name:" + } + br() + input { + type = InputType.text + id = "lname" + name = "lname" + value = "Doe" + } + br() + br() + input { + type = InputType.submit + value = "Submit" } } + + vision("form") { form } + form.onPropertyChange { + println(this) + } } + }.start(false) server.openInBrowser() diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index a55020a2..ed8ae38f 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -15,6 +15,7 @@ import space.kscience.dataforge.meta.Null import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage @@ -36,21 +37,26 @@ fun main() { color.set(Colors.white) } } + val connector = EngineConnectorConfig("localhost", 7777) - val server = embeddedServer(CIO,7777, "localhost") { + val server = embeddedServer(CIO, connector.port, connector.host) { routing { - static { resources() } + } - visionPage(solids.visionManager, VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css")) { - div("flex-column") { - h1 { +"Satellite detector demo" } - vision { sat } - } + visionPage( + connector, + solids.visionManager, VisionPage.threeJsHeader, + VisionPage.styleSheetHeader("css/styles.css") + ) { + div("flex-column") { + h1 { +"Satellite detector demo" } + vision { sat } } } + }.start(false) server.openInBrowser() diff --git a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt index c3b79734..1d6a430c 100644 --- a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt @@ -4,9 +4,8 @@ import io.ktor.http.URLProtocol import io.ktor.server.application.install import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine +import io.ktor.server.engine.EngineConnectorConfig import io.ktor.server.engine.embeddedServer -import io.ktor.server.routing.Routing -import io.ktor.server.routing.route import io.ktor.server.util.url import io.ktor.server.websocket.WebSockets import kotlinx.coroutines.CoroutineScope @@ -26,8 +25,8 @@ import space.kscience.visionforge.html.HtmlFormFragment import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.VisionCollector import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.server.VisionRouteConfiguration -import space.kscience.visionforge.server.require +import space.kscience.visionforge.server.EngineConnectorConfig +import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData import space.kscience.visionforge.visionManager import kotlin.coroutines.CoroutineContext @@ -48,8 +47,6 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout public val visionManager: VisionManager = context.visionManager - private val configuration = VisionRouteConfiguration(visionManager) - private var counter = 0 private var engine: ApplicationEngine? = null @@ -68,7 +65,7 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout public fun startServer( host: String = context.properties["visionforge.host"].string ?: "localhost", - port: Int = context.properties["visionforge.port"].int ?: VisionRouteConfiguration.DEFAULT_PORT, + port: Int = context.properties["visionforge.port"].int ?: VisionRoute.DEFAULT_PORT, ): MimeTypedResult = html { if (engine != null) { p { @@ -77,6 +74,8 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout } } + val connector: EngineConnectorConfig = EngineConnectorConfig(host, port) + engine?.stop(1000, 2000) engine = context.embeddedServer(CIO, port, host) { install(WebSockets) @@ -111,7 +110,7 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout val collector: VisionCollector = mutableMapOf() val url = engine.environment.connectors.first().let { - url{ + url { protocol = URLProtocol.WS host = it.host port = it.port @@ -119,6 +118,8 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout } } + engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), collector) + visionFragment( context, embedData = true, @@ -126,13 +127,6 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout collector = collector, fragment = fragment ) - - engine.application.require(Routing) { - route(cellRoute) { - serveVisionData(TODO(), collector) - } - } - } else { //if not, use static rendering visionFragment(context, fragment = fragment) diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 2fe84660..957936a3 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* +import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.* @@ -30,33 +31,32 @@ import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges import space.kscience.visionforge.html.* -import java.awt.Desktop -import java.net.URI import kotlin.time.Duration.Companion.milliseconds -public enum class DataServeMode { - /** - * Embed the initial state of the vision inside its html tag. - */ - EMBED, - - /** - * Fetch data on vision load. Do not embed data. - */ - FETCH, - - /** - * Connect to server to get pushes. The address of the server is embedded in the tag. - */ - UPDATE -} - -public class VisionRouteConfiguration( +public class VisionRoute( + public val route: String, public val visionManager: VisionManager, override val meta: ObservableMutableMeta = MutableMeta(), ) : Configurable, ContextAware { + public enum class Mode { + /** + * Embed the initial state of the vision inside its html tag. + */ + EMBED, + + /** + * Fetch data on vision load. Do not embed data. + */ + FETCH, + + /** + * Connect to server to get pushes. The address of the server is embedded in the tag. + */ + UPDATE + } + override val context: Context get() = visionManager.context /** @@ -64,7 +64,7 @@ public class VisionRouteConfiguration( */ public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) - public var dataMode: DataServeMode by meta.enum(DataServeMode.UPDATE) + public var dataMode: Mode by meta.enum(Mode.UPDATE) public companion object { public const val DEFAULT_PORT: Int = 7777 @@ -78,65 +78,74 @@ public class VisionRouteConfiguration( * Serve visions in a given [route] without providing a page template. * [visions] could be changed during the service. */ -public fun Route.serveVisionData( - configuration: VisionRouteConfiguration, +public fun Application.serveVisionData( + configuration: VisionRoute, resolveVision: (Name) -> Vision?, ) { - application.log.info("Serving visions at ${this@serveVisionData}") - - //Update websocket - webSocket("ws") { - val name: String = call.request.queryParameters.getOrFail("name") - application.log.debug("Opened server socket for $name") - val vision: Vision = resolveVision(Name.parse(name)) ?: error("Plot with id='$name' not registered") - - launch { - incoming.consumeEach { - val data = it.data.decodeToString() - application.log.debug("Received update: \n$data") - val change = configuration.visionManager.jsonFormat.decodeFromString( - VisionChange.serializer(), data - ) - vision.update(change) + require(WebSockets) + routing { + route(configuration.route) { + install(CORS) { + anyHost() } - } + application.log.info("Serving visions at ${configuration.route}") - try { - withContext(configuration.context.coroutineContext) { - vision.flowChanges(configuration.updateInterval.milliseconds).onEach { update -> - val json = configuration.visionManager.jsonFormat.encodeToString( - VisionChange.serializer(), - update + //Update websocket + webSocket("ws") { + val name: String = call.request.queryParameters.getOrFail("name") + application.log.debug("Opened server socket for $name") + val vision: Vision = resolveVision(Name.parse(name)) ?: error("Plot with id='$name' not registered") + + launch { + incoming.consumeEach { + val data = it.data.decodeToString() + application.log.debug("Received update: \n$data") + val change = configuration.visionManager.jsonFormat.decodeFromString( + VisionChange.serializer(), data + ) + vision.update(change) + } + } + + try { + withContext(configuration.context.coroutineContext) { + vision.flowChanges(configuration.updateInterval.milliseconds).onEach { update -> + val json = configuration.visionManager.jsonFormat.encodeToString( + VisionChange.serializer(), + update + ) + application.log.debug("Sending update: \n$json") + outgoing.send(Frame.Text(json)) + }.collect() + } + } catch (t: Throwable) { + this.application.log.info("WebSocket update channel for $name is closed with exception: $t") + } + } + //Plots in their json representation + get("data") { + val name: String = call.request.queryParameters.getOrFail("name") + + val vision: Vision? = resolveVision(Name.parse(name)) + if (vision == null) { + call.respond(HttpStatusCode.NotFound, "Vision with name '$name' not found") + } else { + call.respondText( + configuration.visionManager.encodeToString(vision), + contentType = ContentType.Application.Json, + status = HttpStatusCode.OK ) - application.log.debug("Sending update: \n$json") - outgoing.send(Frame.Text(json)) - }.collect() + } } - } catch (t: Throwable) { - this.application.log.info("WebSocket update channel for $name is closed with exception: $t") - } - } - //Plots in their json representation - get("data") { - val name: String = call.request.queryParameters.getOrFail("name") - - val vision: Vision? = resolveVision(Name.parse(name)) - if (vision == null) { - call.respond(HttpStatusCode.NotFound, "Vision with name '$name' not found") - } else { - call.respondText( - configuration.visionManager.encodeToString(vision), - contentType = ContentType.Application.Json, - status = HttpStatusCode.OK - ) } } } -public fun Route.serveVisionData( - configuration: VisionRouteConfiguration, +public fun Application.serveVisionData( + configuration: VisionRoute, cache: VisionCollector, ): Unit = serveVisionData(configuration) { cache[it]?.second } + // ///** // * Compile a fragment to string and serve visions from it @@ -161,91 +170,85 @@ public fun Route.serveVisionData( /** * Serve a page, potentially containing any number of visions at a given [route] with given [header]. */ -public fun Route.visionPage( - configuration: VisionRouteConfiguration, +public fun Application.visionPage( + route: String, + configuration: VisionRoute, + connector: EngineConnectorConfig, headers: Collection, visionFragment: HtmlVisionFragment, ) { - application.require(WebSockets) - require(CORS) { - anyHost() - } + require(WebSockets) - val visionCache: VisionCollector = mutableMapOf() - serveVisionData(configuration, visionCache) + val collector: VisionCollector = mutableMapOf() - //filled pages - get { - //re-create html and vision list on each call - call.respondHtml { - val callbackUrl = call.url() - head { - meta { - charset = "utf-8" - } - headers.forEach { header -> - consumer.header() - } + val html = createHTML().apply { + head { + meta { + charset = "utf-8" } - body { - //Load the fragment and remember all loaded visions - visionFragment( - context = configuration.context, - embedData = configuration.dataMode == DataServeMode.EMBED, - fetchDataUrl = if (configuration.dataMode != DataServeMode.EMBED) { - URLBuilder(callbackUrl).apply { - pathSegments = pathSegments + "data" - }.buildString() - } else null, - updatesUrl = if (configuration.dataMode == DataServeMode.UPDATE) { - URLBuilder(callbackUrl).apply { - protocol = URLProtocol.WS - pathSegments = pathSegments + "ws" - }.buildString() - } else null, - visionCache = visionCache, - fragment = visionFragment - ) + headers.forEach { header -> + consumer.header() } } + body { + //Load the fragment and remember all loaded visions + visionFragment( + context = configuration.context, + embedData = configuration.dataMode == VisionRoute.Mode.EMBED, + fetchDataUrl = if (configuration.dataMode != VisionRoute.Mode.EMBED) { + url { + host = connector.host + port = connector.port + path(route, "data") + } + } else null, + updatesUrl = if (configuration.dataMode == VisionRoute.Mode.UPDATE) { + url { + protocol = URLProtocol.WS + host = connector.host + port = connector.port + path(route, "ws") + } + } else null, + visionCache = collector, + fragment = visionFragment + ) + } + }.finalize() + //serve data + serveVisionData(configuration, collector) + + //filled pages + routing { + get(route) { + call.respondText(html, ContentType.Text.Html) + } } } -public fun Route.visionPage( +public fun Application.visionPage( + connector: EngineConnectorConfig, visionManager: VisionManager, vararg headers: HtmlFragment, - configurationBuilder: VisionRouteConfiguration.() -> Unit = {}, + route: String = "/", + configurationBuilder: VisionRoute.() -> Unit = {}, visionFragment: HtmlVisionFragment, ) { - val configuration = VisionRouteConfiguration(visionManager).apply(configurationBuilder) - visionPage(configuration, listOf(*headers), visionFragment) + val configuration = VisionRoute(route, visionManager).apply(configurationBuilder) + visionPage(route, configuration, connector, listOf(*headers), visionFragment) } /** * Render given [VisionPage] at server */ -public fun Route.visionPage(page: VisionPage, configurationBuilder: VisionRouteConfiguration.() -> Unit = {}) { - val configuration = VisionRouteConfiguration(page.visionManager).apply(configurationBuilder) - visionPage(configuration, page.pageHeaders.values, visionFragment = page.content) +public fun Application.visionPage( + connector: EngineConnectorConfig, + page: VisionPage, + route: String = "/", + configurationBuilder: VisionRoute.() -> Unit = {}, +) { + val configuration = VisionRoute(route, page.visionManager).apply(configurationBuilder) + visionPage(route, configuration, connector, page.pageHeaders.values, visionFragment = page.content) } -public fun

, B : Any, F : Any> P.require( - plugin: Plugin, - configure: B.() -> Unit = {}, -): F = pluginOrNull(plugin) ?: install(plugin, configure) - - -/** - * Connect to a given Ktor server using browser - */ -public fun ApplicationEngine.openInBrowser() { - val connector = environment.connectors.first() - val uri = URI("http", null, connector.host, connector.port, null, null, null) - Desktop.getDesktop().browse(uri) -} - -/** - * Stop the server with default timeouts - */ -public fun ApplicationEngine.close(): Unit = stop(1000, 5000) \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt new file mode 100644 index 00000000..f33b59b2 --- /dev/null +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt @@ -0,0 +1,38 @@ +package space.kscience.visionforge.server + +import io.ktor.server.application.ApplicationCall +import io.ktor.server.application.Plugin +import io.ktor.server.application.install +import io.ktor.server.application.pluginOrNull +import io.ktor.server.engine.ApplicationEngine +import io.ktor.server.engine.EngineConnectorBuilder +import io.ktor.server.engine.EngineConnectorConfig +import io.ktor.util.pipeline.Pipeline +import java.awt.Desktop +import java.net.URI + + +public fun

, B : Any, F : Any> P.require( + plugin: Plugin, +): F = pluginOrNull(plugin) ?: install(plugin) + + +/** + * Connect to a given Ktor server using browser + */ +public fun ApplicationEngine.openInBrowser() { + val connector = environment.connectors.first() + val uri = URI("http", null, connector.host, connector.port, null, null, null) + Desktop.getDesktop().browse(uri) +} + +/** + * Stop the server with default timeouts + */ +public fun ApplicationEngine.close(): Unit = stop(1000, 5000) + + +public fun EngineConnectorConfig(host: String, port: Int): EngineConnectorConfig = EngineConnectorBuilder().apply { + this.host = host + this.port = port +} \ No newline at end of file -- 2.34.1 From fd8f693151381f1bab1f2e8d27215cfec21c1264 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Dec 2022 14:51:32 +0300 Subject: [PATCH 108/143] Refactor server API --- .../visionforge/ElementVisionRenderer.kt | 10 ++-- .../kscience/visionforge/VisionClient.kt | 49 ++++++++++++------- .../kscience/visionforge/inputRenderers.kt | 36 ++++++++------ .../visionforge/markup/MarkupPlugin.kt | 3 +- 4 files changed, 61 insertions(+), 37 deletions(-) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index bf9f00df..75ec785a 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -34,7 +34,7 @@ public interface ElementVisionRenderer : Named { * Display the [vision] inside a given [element] replacing its current content. * @param meta additional parameters for rendering container */ - public fun render(element: Element, vision: Vision, meta: Meta = Meta.EMPTY) + public fun render(element: Element, name: Name, vision: Vision, meta: Meta = Meta.EMPTY) public companion object { public const val TYPE: String = "elementVisionRenderer" @@ -49,7 +49,7 @@ public interface ElementVisionRenderer : Named { public class SingleTypeVisionRenderer( public val kClass: KClass, private val acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - private val renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, + private val renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, ) : ElementVisionRenderer { @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) @@ -60,15 +60,15 @@ public class SingleTypeVisionRenderer( override fun rateVision(vision: Vision): Int = if (vision::class == kClass) acceptRating else ElementVisionRenderer.ZERO_RATING - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { element.clear() element.append { - renderFunction(kClass.cast(vision), meta) + renderFunction(name, kClass.cast(vision), meta) } } } public inline fun ElementVisionRenderer( acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - noinline renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, + noinline renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, ): ElementVisionRenderer = SingleTypeVisionRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 81655335..efb8a9fe 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -13,6 +13,7 @@ import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.html.VisionTagConsumer import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOINT_ATTRIBUTE @@ -67,17 +68,29 @@ public class VisionClient : AbstractPlugin() { changeCollector.propertyChanged(visionName, propertyName, item) } + public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Boolean) { + visionPropertyChanged(visionName, propertyName, Meta(item)) + } + + public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: String) { + visionPropertyChanged(visionName, propertyName, Meta(item)) + } + + public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Number) { + visionPropertyChanged(visionName, propertyName, Meta(item)) + } + public fun visionChanged(name: Name?, child: Vision?) { changeCollector.setChild(name, child) } - private fun renderVision(element: Element, vision: Vision, outputMeta: Meta) { + private fun renderVision(element: Element, name: Name, vision: Vision, outputMeta: Meta) { vision.setAsRoot(visionManager) val renderer = findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") - renderer.render(element, vision, outputMeta) + renderer.render(element, name, vision, outputMeta) } - private fun updateVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { + private fun updateVision(element: Element, name: Name, vision: Vision?, outputMeta: Meta) { element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) @@ -89,7 +102,7 @@ public class VisionClient : AbstractPlugin() { URL(attr.value) }.apply { protocol = "ws" - searchParams.append("name", name) + searchParams.append("name", name.toString()) } logger.info { "Updating vision data from $wsUrl" } @@ -106,7 +119,7 @@ public class VisionClient : AbstractPlugin() { // If change contains root vision replacement, do it change.vision?.let { vision -> - renderVision(element, vision, outputMeta) + renderVision(element, name, vision, outputMeta) } logger.debug { "Got update $change for output with name $name" } @@ -152,7 +165,7 @@ public class VisionClient : AbstractPlugin() { */ public fun renderVisionIn(element: Element) { if (!element.classList.contains(VisionTagConsumer.OUTPUT_CLASS)) error("The element $element is not an output element") - val name = resolveName(element) ?: error("The element is not a vision output") + val name = resolveName(element)?.parseAsName() ?: error("The element is not a vision output") if (element.attributes[OUTPUT_RENDERED]?.value == "true") { logger.info { "VF output in element $element is already rendered" } @@ -179,7 +192,7 @@ public class VisionClient : AbstractPlugin() { } else { URL(attr.value) }.apply { - searchParams.append("name", name) + searchParams.append("name", name.toString()) } logger.info { "Fetching vision data from $fetchUrl" } @@ -187,8 +200,8 @@ public class VisionClient : AbstractPlugin() { if (response.ok) { response.text().then { text -> val vision = visionManager.decodeFromString(text) - renderVision(element, vision, outputMeta) - updateVision(name, element, vision, outputMeta) + renderVision(element, name, vision, outputMeta) + updateVision(element, name, vision, outputMeta) } } else { logger.error { "Failed to fetch initial vision state from $fetchUrl" } @@ -203,13 +216,13 @@ public class VisionClient : AbstractPlugin() { visionManager.decodeFromString(it) } logger.info { "Found embedded vision for output with name $name" } - renderVision(element, embeddedVision, outputMeta) - updateVision(name, element, embeddedVision, outputMeta) + renderVision(element, name, embeddedVision, outputMeta) + updateVision(element, name, embeddedVision, outputMeta) } //Try to load vision via websocket element.attributes[OUTPUT_CONNECT_ATTRIBUTE] != null -> { - updateVision(name, element, null, outputMeta) + updateVision(element, name, null, outputMeta) } else -> error("No embedded vision data / fetch url for $name") @@ -217,11 +230,13 @@ public class VisionClient : AbstractPlugin() { element.setAttribute(OUTPUT_RENDERED, "true") } - override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) mapOf( - numberVisionRenderer.name to numberVisionRenderer, - textVisionRenderer.name to textVisionRenderer, - formVisionRenderer.name to formVisionRenderer - ) else super.content(target) + override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) { + listOf( + numberVisionRenderer(this), + textVisionRenderer(this), + formVisionRenderer(this) + ).toMap() + } else super.content(target) public companion object : PluginFactory { override fun build(context: Context, meta: Meta): VisionClient = VisionClient() diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index c6d87b19..86324d89 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -16,42 +16,46 @@ import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionOfNumberField import space.kscience.visionforge.html.VisionOfTextField -public val textVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> - val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" +internal fun textVisionRenderer( + client: VisionClient, +): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> + val fieldName = vision.name ?: "input[${vision.hashCode().toUInt()}]" vision.label?.let { label { - htmlFor = name + htmlFor = fieldName +it } } input { type = InputType.text - this.name = name + this.name = fieldName vision.useProperty(VisionOfTextField::text) { value = it ?: "" } onChangeFunction = { - vision.text = value +// client.visionPropertyChanged(name, VisionOfTextField::text.name.pa, value) } } } -public val numberVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> - val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" +internal fun numberVisionRenderer( + client: VisionClient, +): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> + val fieldName = vision.name ?: "input[${vision.hashCode().toUInt()}]" vision.label?.let { label { - htmlFor = name + htmlFor = fieldName +it } } input { type = InputType.text - this.name = name + this.name = fieldName vision.useProperty(VisionOfNumberField::value) { value = it?.toDouble() ?: 0.0 } onChangeFunction = { - vision.value = value.toDoubleOrNull() +// vision.value = value.toDoubleOrNull() } } } @@ -61,7 +65,8 @@ internal fun FormData.toMeta(): Meta { //val res = js("Object.fromEntries(formData);") val `object` = js("{}") //language=JavaScript - js(""" + js( + """ formData.forEach(function(value, key){ // Reflect.has in favor of: object.hasOwnProperty(key) if(!Reflect.has(object, key)){ @@ -73,11 +78,14 @@ internal fun FormData.toMeta(): Meta { } object[key].push(value); }); - """) + """ + ) return DynamicMeta(`object`) } -public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> +internal fun formVisionRenderer( + client: VisionClient, +): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> val form = document.getElementById(vision.formId) as? HTMLFormElement ?: error("An element with id = '${vision.formId} is not a form") @@ -95,7 +103,7 @@ public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { require(vision is VisionOfMarkup) { "The vision is not a markup vision" } val div = document.createElement("div") val flavour = when (vision.format) { -- 2.34.1 From fef1df3ab4a309b1d9932f994f133c49239a76ab Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 6 Dec 2022 15:54:34 +0300 Subject: [PATCH 109/143] Refactor server API --- .../kotlin/VisionForgePlayGroundForJupyter.kt | 3 +- .../src/jvmMain/kotlin/formServer.kt | 22 ++++++---- .../src/jvmMain/kotlin/serverExtensions.kt | 6 +-- jupyter/src/jvmMain/kotlin/VFForNotebook.kt | 12 +++--- .../src/jvmMain/kotlin/VFIntegrationBase.kt | 10 +++-- jupyter/src/jvmMain/kotlin/forms.kt | 27 ++++++++++++ .../src/jvmMain/kotlin/GdmlForJupyter.kt | 3 +- .../ThreeWithControlsPlugin.kt | 2 +- .../visionforge/html/HtmlVisionRenderer.kt | 41 +++++++++++-------- .../visionforge/html/VisionOfHtmlForm.kt | 30 +++----------- .../visionforge/html/VisionTagConsumer.kt | 7 +++- .../kscience/visionforge/html/HtmlTagTest.kt | 2 +- .../kscience/visionforge/VisionClient.kt | 38 +++++++++-------- .../kscience/visionforge/inputRenderers.kt | 14 ++++--- .../kscience/visionforge/html/htmlExport.kt | 9 ++-- .../kscience/visionforge/plotly/plotlyJs.kt | 2 +- .../visionforge/server/VisionServer.kt | 15 ++++--- .../visionforge/tables/TableVisionJsPlugin.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 4 +- .../visionforge/three/serverExtensions.kt | 1 - 20 files changed, 142 insertions(+), 108 deletions(-) create mode 100644 jupyter/src/jvmMain/kotlin/forms.kt diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 212d906e..0b87e06d 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -10,13 +10,14 @@ import space.kscience.visionforge.jupyter.VFIntegrationBase import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.visionManager @DFExperimental internal class VisionForgePlayGroundForJupyter : VFIntegrationBase( Context("VisionForge") { plugin(Solids) plugin(PlotlyPlugin) - } + }.visionManager ) { override fun Builder.afterLoaded() { diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 9e635dc9..cef13f0b 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -8,8 +8,9 @@ import kotlinx.html.* import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.formFragment +import space.kscience.visionforge.html.bindForm import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.close @@ -28,8 +29,18 @@ fun main() { resources() } - visionPage(connector, visionManager, VisionPage.scriptHeader("js/visionforge-playground.js")) { - val form = formFragment("form") { + val form = VisionOfHtmlForm("form").apply { + onPropertyChange(visionManager.context) { + println(this) + } + } + + visionPage( + connector, + visionManager, + VisionPage.scriptHeader("js/visionforge-playground.js"), + ) { + bindForm(form) { label { htmlFor = "fname" +"First name:" @@ -61,10 +72,7 @@ fun main() { } } - vision("form") { form } - form.onPropertyChange { - println(this) - } + vision(form) } }.start(false) diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index a3bde8d6..b22c6514 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -1,11 +1,7 @@ package space.kscience.visionforge.examples import space.kscience.dataforge.context.Global -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.importScriptHeader -import space.kscience.visionforge.makeFile +import space.kscience.visionforge.html.* import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path diff --git a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt index 1d6a430c..eb61f889 100644 --- a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt @@ -20,10 +20,10 @@ import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.HtmlFormFragment import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.VisionCollector import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.VisionRoute @@ -107,7 +107,7 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout //server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) val cellRoute = "content-${counter++}" - val collector: VisionCollector = mutableMapOf() + val collector: MutableMap = mutableMapOf() val url = engine.environment.connectors.first().let { url { @@ -121,15 +121,15 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), collector) visionFragment( - context, + visionManager, embedData = true, updatesUrl = url, - collector = collector, + onVisionRendered = { name, vision -> collector[name] = vision }, fragment = fragment ) } else { //if not, use static rendering - visionFragment(context, fragment = fragment) + visionFragment(visionManager, fragment = fragment) } } renderScriptForId(id) diff --git a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt index 8aa9348a..bf6322e9 100644 --- a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt +++ b/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt @@ -9,6 +9,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.* import kotlin.random.Random import kotlin.random.nextUInt @@ -17,9 +18,12 @@ import kotlin.random.nextUInt * A base class for different Jupyter VF integrations */ @DFExperimental -public abstract class VFIntegrationBase(final override val context: Context) : JupyterIntegration(), ContextAware { +public abstract class VFIntegrationBase( + public val visionManager: VisionManager, +) : JupyterIntegration(), ContextAware { - protected val handler: VFForNotebook = VFForNotebook(context) + override val context: Context get() = visionManager.context + protected val handler: VFForNotebook = VFForNotebook(visionManager.context) protected abstract fun Builder.afterLoaded() @@ -67,7 +71,7 @@ public abstract class VFIntegrationBase(final override val context: Context) : J val id = "fragment[${page.hashCode()}/${Random.nextUInt()}]" div { this.id = id - visionFragment(context, fragment = page.content) + visionFragment(visionManager, fragment = page.content) } renderScriptForId(id) } diff --git a/jupyter/src/jvmMain/kotlin/forms.kt b/jupyter/src/jvmMain/kotlin/forms.kt new file mode 100644 index 00000000..bccce2e7 --- /dev/null +++ b/jupyter/src/jvmMain/kotlin/forms.kt @@ -0,0 +1,27 @@ +package space.kscience.visionforge.jupyter + +import kotlinx.html.FORM +import kotlinx.html.form +import kotlinx.html.id +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.VisionOfHtmlForm + +public class HtmlFormFragment internal constructor( + public val vision: VisionOfHtmlForm, + public val formBody: HtmlFragment, +){ + public val values: Meta? get() = vision.values + public operator fun get(valueName: String): Meta? = values?.get(valueName) +} + +public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment { + val realId = id ?: "form[${builder.hashCode().toUInt()}]" + return HtmlFormFragment(VisionOfHtmlForm(realId)) { + form { + this.id = realId + builder() + } + } +} \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 0f430053..0d55be2e 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -7,12 +7,13 @@ import space.kscience.gdml.Gdml import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.jupyter.VFIntegrationBase import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.visionManager @DFExperimental internal class GdmlForJupyter : VFIntegrationBase( Context("GDML") { plugin(Solids) - } + }.visionManager ) { override fun Builder.afterLoaded() { diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index 191742ca..03cbb722 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -25,7 +25,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { override fun rateVision(vision: Vision): Int = if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { createRoot(element).render { child(ThreeCanvasWithControls) { attrs { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 341c38ab..d3c2427f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -15,8 +14,6 @@ public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit @DFExperimental public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content -public typealias VisionCollector = MutableMap> - /** * Render a fragment in the given consumer and return a map of extracted visions @@ -27,15 +24,18 @@ public typealias VisionCollector = MutableMap> * @param idPrefix a prefix to be used before vision ids */ public fun TagConsumer<*>.visionFragment( - context: Context, + visionManager: VisionManager, embedData: Boolean = true, fetchDataUrl: String? = null, updatesUrl: String? = null, idPrefix: String? = null, - collector: VisionCollector = mutableMapOf(), + onVisionRendered: (Name, Vision) -> Unit = { _, _ -> }, fragment: HtmlVisionFragment, ) { - val consumer = object : VisionTagConsumer(this@visionFragment, context, idPrefix) { + + val collector: MutableMap> = mutableMapOf() + + val consumer = object : VisionTagConsumer(this@visionFragment, visionManager, idPrefix) { override fun TagConsumer.vision(name: Name?, buildOutput: VisionOutput.() -> Vision): T { //Avoid re-creating cached visions @@ -47,6 +47,7 @@ public fun TagConsumer<*>.visionFragment( val (output, vision) = collector.getOrPut(actualName) { val output = VisionOutput(context, actualName) val vision = output.buildOutput() + onVisionRendered(actualName, vision) output to vision } @@ -54,8 +55,15 @@ public fun TagConsumer<*>.visionFragment( } override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { - // Toggle update mode + val (_, actualVision) = collector.getOrPut(name) { + val output = VisionOutput(context, name) + onVisionRendered(name, vision) + output to vision + } + + + // Toggle update mode updatesUrl?.let { attributes[OUTPUT_CONNECT_ATTRIBUTE] = it } @@ -69,7 +77,7 @@ public fun TagConsumer<*>.visionFragment( type = "text/json" attributes["class"] = OUTPUT_DATA_CLASS unsafe { - +"\n${manager.encodeToString(vision)}\n" + +"\n${manager.encodeToString(actualVision)}\n" } } } @@ -80,19 +88,20 @@ public fun TagConsumer<*>.visionFragment( } public fun FlowContent.visionFragment( - context: Context, + visionManager: VisionManager, embedData: Boolean = true, fetchDataUrl: String? = null, updatesUrl: String? = null, + onVisionRendered: (Name, Vision) -> Unit = { _, _ -> }, idPrefix: String? = null, - visionCache: VisionCollector = mutableMapOf(), + fragment: HtmlVisionFragment, ): Unit = consumer.visionFragment( - context, - embedData, - fetchDataUrl, - updatesUrl, - idPrefix, - visionCache, + visionManager = visionManager, + embedData = embedData, + fetchDataUrl = fetchDataUrl, + updatesUrl = updatesUrl, + idPrefix = idPrefix, + onVisionRendered = onVisionRendered, fragment = fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index 4315066a..d9c0347d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -7,7 +7,6 @@ import kotlinx.html.id import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node @Serializable @@ -18,29 +17,10 @@ public class VisionOfHtmlForm( public var values: Meta? by mutableProperties.node() } -public class HtmlFormFragment internal constructor( - public val vision: VisionOfHtmlForm, - public val formBody: HtmlFragment, -){ - public val values: Meta? get() = vision.values - public operator fun get(valueName: String): Meta? = values?.get(valueName) -} - -public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment { - val realId = id ?: "form[${builder.hashCode().toUInt()}]" - return HtmlFormFragment(VisionOfHtmlForm(realId)) { - form { - this.id = realId - builder() - } - } -} - -public fun TagConsumer.formFragment( - id: String? = null, +public fun TagConsumer.bindForm( + visionOfForm: VisionOfHtmlForm, builder: FORM.() -> Unit, -): VisionOfHtmlForm { - val formFragment = HtmlFormFragment(id, builder) - fragment(formFragment.formBody) - return formFragment.vision +): R = form { + this.id = visionOfForm.formId + builder() } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 6fc915ef..80a7be7e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.html import kotlinx.html.* import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer @@ -56,9 +57,11 @@ public class VisionOutput @PublishedApi internal constructor(public val context: @VisionDSL public abstract class VisionTagConsumer( private val root: TagConsumer, - public val context: Context, + public val visionManager: VisionManager, private val idPrefix: String? = null, -) : TagConsumer by root { +) : TagConsumer by root, ContextAware { + + override val context: Context get() = visionManager.context public open fun resolveId(name: Name): String = (idPrefix ?: "output") + "[$name]" diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 670f2018..efc7cfd0 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -18,7 +18,7 @@ fun FlowContent.renderVisionFragment( fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(consumer, Global, idPrefix) { + val consumer = object : VisionTagConsumer(consumer, Global.visionManager, idPrefix) { override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision renderer(name, vision, outputMeta) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index efb8a9fe..9a6547ce 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -4,6 +4,7 @@ import kotlinx.browser.document import kotlinx.browser.window import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import org.w3c.dom.* import org.w3c.dom.url.URL @@ -68,18 +69,6 @@ public class VisionClient : AbstractPlugin() { changeCollector.propertyChanged(visionName, propertyName, item) } - public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Boolean) { - visionPropertyChanged(visionName, propertyName, Meta(item)) - } - - public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: String) { - visionPropertyChanged(visionName, propertyName, Meta(item)) - } - - public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Number) { - visionPropertyChanged(visionName, propertyName, Meta(item)) - } - public fun visionChanged(name: Name?, child: Vision?) { changeCollector.setChild(name, child) } @@ -139,10 +128,12 @@ public class VisionClient : AbstractPlugin() { onopen = { feedbackJob = visionManager.context.launch { - delay(feedbackAggregationTime.milliseconds) - if (!changeCollector.isEmpty()) { - send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) - changeCollector.reset() + while (isActive) { + delay(feedbackAggregationTime.milliseconds) + if (!changeCollector.isEmpty()) { + send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) + changeCollector.reset() + } } } logger.info { "WebSocket update channel established for output '$name'" } @@ -247,6 +238,21 @@ public class VisionClient : AbstractPlugin() { } } +public fun VisionClient.visionPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { + visionPropertyChanged(visionName, propertyName.parseAsName(true), item) +} + +public fun VisionClient.visionPropertyChanged(visionName: Name, propertyName: String, item: Number) { + visionPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} + +public fun VisionClient.visionPropertyChanged(visionName: Name, propertyName: String, item: String) { + visionPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} + +public fun VisionClient.visionPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { + visionPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} private fun whenDocumentLoaded(block: Document.() -> Unit): Unit { if (document.body != null) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 86324d89..390058ea 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -9,8 +9,11 @@ import org.w3c.dom.HTMLFormElement import org.w3c.dom.HTMLInputElement import org.w3c.dom.get import org.w3c.xhr.FormData +import space.kscience.dataforge.context.debug +import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.DynamicMeta import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.toMap import space.kscience.dataforge.meta.valueSequence import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionOfNumberField @@ -33,7 +36,7 @@ internal fun textVisionRenderer( value = it ?: "" } onChangeFunction = { -// client.visionPropertyChanged(name, VisionOfTextField::text.name.pa, value) + client.visionPropertyChanged(name, VisionOfTextField::text.name, value) } } } @@ -55,7 +58,7 @@ internal fun numberVisionRenderer( value = it?.toDouble() ?: 0.0 } onChangeFunction = { -// vision.value = value.toDoubleOrNull() + client.visionPropertyChanged(name, VisionOfNumberField::value.name, value) } } } @@ -90,9 +93,10 @@ internal fun formVisionRenderer( val form = document.getElementById(vision.formId) as? HTMLFormElement ?: error("An element with id = '${vision.formId} is not a form") - console.info("Adding hooks to form '$form'") + client.logger.debug{"Adding hooks to form with id = '$vision.formId'"} vision.useProperty(VisionOfHtmlForm::values) { values -> + client.logger.debug{"Updating form '${vision.formId}' with values $values"} val inputs = form.getElementsByTagName("input") values?.valueSequence()?.forEach { (token, value) -> (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() @@ -102,8 +106,8 @@ internal fun formVisionRenderer( form.onsubmit = { event -> event.preventDefault() val formData = FormData(form).toMeta() - //console.log(formData.toString()) - //vision.values = formData + client.visionPropertyChanged(name, VisionOfHtmlForm::values.name, formData) + console.info("Sent: ${formData.toMap()}") false } } \ No newline at end of file diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index cba1ee31..ff0c3eee 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.html.body import kotlinx.html.head @@ -6,10 +6,7 @@ import kotlinx.html.meta import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Global import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.html.HtmlFragment -import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.fragment -import space.kscience.visionforge.html.visionFragment +import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Files import java.nio.file.Path @@ -87,7 +84,7 @@ public fun VisionPage.makeFile( } } body { - visionFragment(Global, fragment = content) + visionFragment(Global.visionManager, fragment = content) } }.finalize() diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index d3b8473e..8344e52e 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -28,7 +28,7 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) element.plot(plot, config) diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 957936a3..42f02e75 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -15,7 +15,6 @@ import io.ktor.server.util.* import io.ktor.server.websocket.* import io.ktor.util.pipeline.* import io.ktor.websocket.* -import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @@ -97,8 +96,8 @@ public fun Application.serveVisionData( val vision: Vision = resolveVision(Name.parse(name)) ?: error("Plot with id='$name' not registered") launch { - incoming.consumeEach { - val data = it.data.decodeToString() + for(frame in incoming) { + val data = frame.data.decodeToString() application.log.debug("Received update: \n$data") val change = configuration.visionManager.jsonFormat.decodeFromString( VisionChange.serializer(), data @@ -143,8 +142,8 @@ public fun Application.serveVisionData( public fun Application.serveVisionData( configuration: VisionRoute, - cache: VisionCollector, -): Unit = serveVisionData(configuration) { cache[it]?.second } + data: Map, +): Unit = serveVisionData(configuration) { data[it] } // ///** @@ -179,7 +178,7 @@ public fun Application.visionPage( ) { require(WebSockets) - val collector: VisionCollector = mutableMapOf() + val collector: MutableMap = mutableMapOf() val html = createHTML().apply { head { @@ -193,7 +192,7 @@ public fun Application.visionPage( body { //Load the fragment and remember all loaded visions visionFragment( - context = configuration.context, + visionManager = configuration.visionManager, embedData = configuration.dataMode == VisionRoute.Mode.EMBED, fetchDataUrl = if (configuration.dataMode != VisionRoute.Mode.EMBED) { url { @@ -210,7 +209,7 @@ public fun Application.visionPage( path(route, "ws") } } else null, - visionCache = collector, + onVisionRendered = { name, vision -> collector[name] = vision }, fragment = visionFragment ) } diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 28ad7327..dcf7ce4f 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -35,7 +35,7 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { val table: VisionOfTable = (vision as? VisionOfTable) ?: error("VisionOfTable expected but ${vision::class} found") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index bae26853..5aacba18 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -86,7 +86,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { }.launchIn(context) vision.children.changes.onEach { childName -> - if(childName.isEmpty()) return@onEach + if (childName.isEmpty()) return@onEach val child = vision.children.getChild(childName) @@ -147,7 +147,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { render(vision) } - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { renderSolid( element, vision as? Solid ?: error("Solid expected but ${vision::class} found"), diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt index 8f52ccf1..ba533979 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.three import space.kscience.dataforge.context.Global import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.* -import space.kscience.visionforge.makeFile import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path -- 2.34.1 From d28873e796fc8315da750417ff00dbf7a4132c18 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 6 Dec 2022 17:04:13 +0300 Subject: [PATCH 110/143] Refactor server API --- .../src/jvmMain/kotlin/formServer.kt | 4 +-- .../kscience/visionforge/VisionChange.kt | 6 +++-- .../kscience/visionforge/VisionClient.kt | 21 ++++++++------- .../visionforge/server/VisionServer.kt | 27 +++---------------- 4 files changed, 20 insertions(+), 38 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index cef13f0b..461262a5 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -31,7 +31,7 @@ fun main() { val form = VisionOfHtmlForm("form").apply { onPropertyChange(visionManager.context) { - println(this) + println(values) } } @@ -71,7 +71,7 @@ fun main() { value = "Submit" } } - + println(form.values) vision(form) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 1fbc33bc..358e72aa 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -55,6 +55,8 @@ public class VisionChangeBuilder : MutableVisionContainer { private var propertyChange = MutableMeta() private val children: HashMap = HashMap() + public operator fun get(name: Name): VisionChangeBuilder? = children[name] + public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() @Synchronized @@ -153,7 +155,7 @@ private fun CoroutineScope.collectChange( */ public fun Vision.flowChanges( collectionDuration: Duration, - sendInitial: Boolean = false + sendInitial: Boolean = false, ): Flow = flow { val manager = manager ?: error("Orphan vision could not collect changes") coroutineScope { @@ -161,7 +163,7 @@ public fun Vision.flowChanges( val mutex = Mutex() collectChange(Name.EMPTY, this@flowChanges, mutex, collector) - if(sendInitial) { + if (sendInitial) { //Send initial vision state val initialChange = VisionChange(vision = deepCopy(manager)) emit(initialChange) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 9a6547ce..6f322268 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -69,9 +69,9 @@ public class VisionClient : AbstractPlugin() { changeCollector.propertyChanged(visionName, propertyName, item) } - public fun visionChanged(name: Name?, child: Vision?) { - changeCollector.setChild(name, child) - } +// public fun visionChanged(name: Name?, child: Vision?) { +// changeCollector.setChild(name, child) +// } private fun renderVision(element: Element, name: Name, vision: Vision, outputMeta: Meta) { vision.setAsRoot(visionManager) @@ -79,7 +79,7 @@ public class VisionClient : AbstractPlugin() { renderer.render(element, name, vision, outputMeta) } - private fun updateVision(element: Element, name: Name, vision: Vision?, outputMeta: Meta) { + private fun startVisionUpdate(element: Element, name: Name, vision: Vision?, outputMeta: Meta) { element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) @@ -130,9 +130,10 @@ public class VisionClient : AbstractPlugin() { feedbackJob = visionManager.context.launch { while (isActive) { delay(feedbackAggregationTime.milliseconds) - if (!changeCollector.isEmpty()) { - send(visionManager.encodeToString(changeCollector.deepCopy(visionManager))) - changeCollector.reset() + val change = changeCollector[name] ?: continue + if (!change.isEmpty()) { + send(visionManager.encodeToString(change.deepCopy(visionManager))) + change.reset() } } } @@ -192,7 +193,7 @@ public class VisionClient : AbstractPlugin() { response.text().then { text -> val vision = visionManager.decodeFromString(text) renderVision(element, name, vision, outputMeta) - updateVision(element, name, vision, outputMeta) + startVisionUpdate(element, name, vision, outputMeta) } } else { logger.error { "Failed to fetch initial vision state from $fetchUrl" } @@ -208,12 +209,12 @@ public class VisionClient : AbstractPlugin() { } logger.info { "Found embedded vision for output with name $name" } renderVision(element, name, embeddedVision, outputMeta) - updateVision(element, name, embeddedVision, outputMeta) + startVisionUpdate(element, name, embeddedVision, outputMeta) } //Try to load vision via websocket element.attributes[OUTPUT_CONNECT_ATTRIBUTE] != null -> { - updateVision(element, name, null, outputMeta) + startVisionUpdate(element, name, null, outputMeta) } else -> error("No embedded vision data / fetch url for $name") diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 42f02e75..c05a1834 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -93,12 +93,12 @@ public fun Application.serveVisionData( webSocket("ws") { val name: String = call.request.queryParameters.getOrFail("name") application.log.debug("Opened server socket for $name") - val vision: Vision = resolveVision(Name.parse(name)) ?: error("Plot with id='$name' not registered") + val vision: Vision = resolveVision(Name.parse(name)) ?: error("Vision with id='$name' not registered") launch { for(frame in incoming) { val data = frame.data.decodeToString() - application.log.debug("Received update: \n$data") + application.log.debug("Received update for $name: \n$data") val change = configuration.visionManager.jsonFormat.decodeFromString( VisionChange.serializer(), data ) @@ -113,7 +113,7 @@ public fun Application.serveVisionData( VisionChange.serializer(), update ) - application.log.debug("Sending update: \n$json") + application.log.debug("Sending update for $name: \n$json") outgoing.send(Frame.Text(json)) }.collect() } @@ -145,27 +145,6 @@ public fun Application.serveVisionData( data: Map, ): Unit = serveVisionData(configuration) { data[it] } -// -///** -// * Compile a fragment to string and serve visions from it -// */ -//public fun Route.serveVisionsFromFragment( -// consumer: TagConsumer<*>, -// sererPageUrl: Url, -// visionManager: VisionManager, -// fragment: HtmlVisionFragment, -//): Unit { -// val visions = consumer.visionFragment( -// visionManager.context, -// embedData = true, -// fetchUpdatesUrl = "$serverUrl$route/ws", -// fragment = fragment -// ) -// -// serveVisionData(visionManager, visions) -//} - - /** * Serve a page, potentially containing any number of visions at a given [route] with given [header]. */ -- 2.34.1 From 2bdaea2e82fd0dff22783d6c1c4687ee5c63ce5c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 17 Jan 2023 18:50:19 +0300 Subject: [PATCH 111/143] Update dependencies and compatibility --- demo/gdml/build.gradle.kts | 4 +- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 2 +- demo/js-playground/build.gradle.kts | 4 +- .../src/main/kotlin/JsPlaygroundApp.kt | 2 +- demo/muon-monitor/build.gradle.kts | 2 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 2 +- demo/playground/build.gradle.kts | 6 ++- .../src/jvmMain/kotlin/serverExtensions.kt | 6 ++- demo/sat-demo/build.gradle.kts | 2 +- .../src/main/kotlin/ru/mipt/npm/sat/static.kt | 21 ++++++++++ gradle.properties | 3 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../visionforge-jupyter-gdml/build.gradle.kts | 4 +- .../bootstrap/visionPropertyEditor.kt | 3 +- .../kscience/visionforge/react/createRoot.kt | 17 ++++++++ ui/ring/build.gradle.kts | 4 +- .../ThreeWithControlsPlugin.kt | 3 +- .../ringPropertyEditor.kt | 1 - .../kscience/visionforge/html/headers.kt | 40 +++++++++++++------ visionforge-tables/build.gradle.kts | 4 +- .../visionforge/tables/TableVisionJsPlugin.kt | 2 +- .../solid/three/ThreeLabelFactory.kt | 2 +- .../kscience/visionforge/three/jsMain.kt | 6 +-- .../visionforge/three/serverExtensions.kt | 7 +++- .../visionforge/three/TestServerExtensions.kt | 23 +++++++++++ 25 files changed, 130 insertions(+), 42 deletions(-) create mode 100644 demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt create mode 100644 ui/react/src/main/kotlin/space/kscience/visionforge/react/createRoot.kt create mode 100644 visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 39c82290..69f56419 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -21,7 +21,9 @@ kotlin { useCommonJs() browser { commonWebpackConfig { - cssSupport.enabled = false + cssSupport{ + enabled.set(false) + } } } } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index e2d7ad51..5f1d24e1 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -2,13 +2,13 @@ package space.kscience.visionforge.gdml.demo import kotlinx.css.* import org.w3c.dom.Document -import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.react.createRoot import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index ada5841a..3368c5ef 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -12,7 +12,9 @@ kotlin{ useCommonJs() browser { commonWebpackConfig { - cssSupport.enabled = false + cssSupport{ + enabled.set(false) + } } } } diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 2c93d31f..781aa897 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,6 +1,5 @@ import kotlinx.css.* import org.w3c.dom.Document -import react.dom.client.createRoot import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context @@ -11,6 +10,7 @@ import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionClient import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.react.createRoot import space.kscience.visionforge.react.render import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index fe3f89cb..f25c8371 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -22,7 +22,7 @@ kotlin { browser { commonWebpackConfig { cssSupport { - enabled = false + enabled.set(false) } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 50e51859..d28516d0 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,11 +1,11 @@ package ru.mipt.npm.muon.monitor import org.w3c.dom.Document -import react.dom.client.createRoot import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.react.createRoot import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreePlugin diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 076f9d37..57c6bfd2 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -16,11 +16,13 @@ kotlin { useCommonJs() browser { webpackTask { - this.outputFileName = "js/visionforge-playground.js" + outputFileName = "js/visionforge-playground.js" } commonWebpackConfig { sourceMaps = true - cssSupport.enabled = false + cssSupport{ + enabled.set(false) + } } } binaries.executable() diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index b22c6514..9eb87730 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -16,7 +16,11 @@ public fun makeVisionFile( val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> mapOf( "title" to VisionPage.title(title), - "playground" to VisionPage.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + "playground" to VisionPage.importScriptHeader( + "js/visionforge-playground.js", + resourceLocation, + actualPath + ), ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 870f3388..406591ee 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -15,7 +15,7 @@ group = "ru.mipt.npm" dependencies{ implementation(project(":visionforge-threejs:visionforge-threejs-server")) - implementation("ch.qos.logback:logback-classic:1.2.11") + implementation("ch.qos.logback:logback-classic:1.4.5") } application { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt new file mode 100644 index 00000000..2a1fd240 --- /dev/null +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt @@ -0,0 +1,21 @@ +package ru.mipt.npm.sat + +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.material +import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.solid +import space.kscience.visionforge.three.makeThreeJsFile + +@OptIn(DFExperimental::class) +fun main() = makeThreeJsFile(resourceLocation = ResourceLocation.SYSTEM) { + vision ("canvas") { + solid { + box(100, 100, 100) + material { + emissiveColor.set("red") + } + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 056b8ac8..b80e2265 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,8 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true -kotlin.jupyter.add.scanner=false kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.13.3-kotlin-1.7.20 \ No newline at end of file +toolsVersion=0.13.4-kotlin-1.8.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661e..070cb702 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index 3129de1e..1198f022 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -14,7 +14,9 @@ kotlin { } commonWebpackConfig { sourceMaps = false - cssSupport.enabled = false + cssSupport{ + enabled.set(false) + } } } binaries.executable() diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 6ea0659c..8e7e1208 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.bootstrap import org.w3c.dom.Element import react.RBuilder -import react.dom.client.createRoot import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.isEmpty import space.kscience.visionforge.Vision @@ -67,6 +66,6 @@ public fun RBuilder.visionPropertyEditor( public fun Element.visionPropertyEditor( item: Vision, descriptor: MetaDescriptor? = item.descriptor, -): Unit = createRoot(this).render { +): Unit = space.kscience.visionforge.react.createRoot(this).render { visionPropertyEditor(item, descriptor = descriptor) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/createRoot.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/createRoot.kt new file mode 100644 index 00000000..fec86770 --- /dev/null +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/createRoot.kt @@ -0,0 +1,17 @@ + +@file:JsModule("react-dom/client") +@file:JsNonModule + +package space.kscience.visionforge.react + +import org.w3c.dom.Element +import react.dom.client.Root +import react.dom.client.RootOptions + +/** + * Compatibility method to work with old browser API + */ +public external fun createRoot( + container: Element, + options: RootOptions = definedExternally, +): Root diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index aa168c11..8b4bf056 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -9,7 +9,9 @@ kotlin{ useCommonJs() browser { commonWebpackConfig { - cssSupport.enabled = false + cssSupport{ + enabled.set(false) + } } } } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index 03cbb722..60f36fb0 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.ring import kotlinx.coroutines.async import org.w3c.dom.Element -import react.dom.client.createRoot import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory @@ -26,7 +25,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { - createRoot(element).render { + space.kscience.visionforge.react.createRoot(element).render { child(ThreeCanvasWithControls) { attrs { this.solids = three.solids diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt index a3f81adb..83529d28 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.ring import org.w3c.dom.Element import react.RBuilder -import react.dom.client.createRoot import react.dom.p import ringui.Island import ringui.SmartTabs diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index 71410372..4c4ab90a 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -4,12 +4,10 @@ import kotlinx.html.link import kotlinx.html.script import kotlinx.html.unsafe import org.slf4j.LoggerFactory -import space.kscience.visionforge.VisionManager import java.nio.file.Files import java.nio.file.Path import java.nio.file.StandardOpenOption import java.security.MessageDigest -import kotlin.io.path.ExperimentalPathApi import kotlin.io.path.readText @@ -47,15 +45,14 @@ private fun ByteArray.toHexString() = asUByteArray().joinToString("") { it.toStr * Check if the asset exists in given local location and put it there if it does not * @param */ -@OptIn(ExperimentalPathApi::class) -internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String): Path { +internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String, classLoader: ClassLoader): Path { val logger = LoggerFactory.getLogger("") logger.info("Resolving or storing resource file $resource") val fullPath = htmlPath.resolveSibling(filePath).toAbsolutePath().resolve(resource) logger.debug("Full path to resource file $resource: $fullPath") - val bytes = VisionManager.Companion::class.java.getResourceAsStream("/$resource")?.readAllBytes() + val bytes = classLoader.getResourceAsStream(resource)?.readAllBytes() ?: error("Resource $resource not found on classpath") val md = MessageDigest.getInstance("MD5") @@ -66,8 +63,20 @@ internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String): if (!skip) { logger.debug("File $fullPath does not exist or wrong checksum. Writing file") Files.createDirectories(fullPath.parent) - Files.write(fullPath, bytes, StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) - Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) + Files.write( + fullPath, + bytes, + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.WRITE + ) + Files.write( + md5File, + checksum.encodeToByteArray(), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.WRITE + ) } return if (htmlPath.isAbsolute && fullPath.startsWith(htmlPath.parent)) { @@ -89,11 +98,11 @@ internal fun fileScriptHeader( } } -internal fun embedScriptHeader(resource: String): HtmlFragment = { +internal fun embedScriptHeader(resource: String, classLoader: ClassLoader): HtmlFragment = { script { type = "text/javascript" unsafe { - val bytes = VisionManager::class.java.getResourceAsStream("/$resource")!!.readAllBytes() + val bytes = classLoader.getResourceAsStream(resource)!!.readAllBytes() +bytes.toString(Charsets.UTF_8) } } @@ -103,8 +112,9 @@ internal fun fileCssHeader( basePath: Path, cssPath: Path, resource: String, + classLoader: ClassLoader, ): HtmlFragment = { - val relativePath = checkOrStoreFile(basePath, cssPath, resource) + val relativePath = checkOrStoreFile(basePath, cssPath, resource, classLoader) link { rel = "stylesheet" href = relativePath.toString() @@ -118,22 +128,26 @@ public fun VisionPage.Companion.importScriptHeader( scriptResource: String, resourceLocation: ResourceLocation, htmlPath: Path? = null, + classLoader: ClassLoader = Thread.currentThread().contextClassLoader, ): HtmlFragment { val targetPath = when (resourceLocation) { ResourceLocation.LOCAL -> checkOrStoreFile( htmlPath ?: Path.of("."), Path.of(VISIONFORGE_ASSETS_PATH), - scriptResource + scriptResource, + classLoader ) + ResourceLocation.SYSTEM -> checkOrStoreFile( Path.of("."), Path.of(System.getProperty("user.home")).resolve(VISIONFORGE_ASSETS_PATH), - scriptResource + scriptResource, classLoader ) + ResourceLocation.EMBED -> null } return if (targetPath == null) { - embedScriptHeader(scriptResource) + embedScriptHeader(scriptResource, classLoader) } else { fileScriptHeader(targetPath) } diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 55cc27e5..abc56455 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -14,7 +14,9 @@ kotlin { binaries.library() browser{ commonWebpackConfig{ - cssSupport.enabled = true + cssSupport{ + enabled.set(true) + } } } } diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index dcf7ce4f..4764069f 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.tables -import kotlinx.js.jso +import js.core.jso import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.AbstractPlugin diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 2bd8c572..e168c1d2 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid.three -import kotlinx.js.jso +import js.core.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index 69a9ac51..ed2908f5 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -6,8 +6,6 @@ import space.kscience.visionforge.solid.three.ThreePlugin @DFExperimental -public fun main(): Unit { - runVisionClient { - plugin(ThreePlugin) - } +public fun main(): Unit = runVisionClient { + plugin(ThreePlugin) } \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt index ba533979..28f04f8d 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -10,7 +10,6 @@ import java.nio.file.Path public val VisionPage.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") - @DFExperimental public fun makeThreeJsFile( path: Path? = null, @@ -22,7 +21,11 @@ public fun makeThreeJsFile( val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> mapOf( "title" to VisionPage.title(title), - "threeJs" to VisionPage.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) + "threeJs" to VisionPage.importScriptHeader( + "js/visionforge-three.js", + resourceLocation, + actualPath, + ) ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt new file mode 100644 index 00000000..99e7fba6 --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt @@ -0,0 +1,23 @@ +package space.kscience.visionforge.three + +import kotlinx.html.stream.createHTML +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.html.importScriptHeader +import kotlin.test.Test + +class TestServerExtensions { + + @Test + fun testServerHeader(){ + val string = createHTML().apply { + VisionPage.importScriptHeader( + "js/visionforge-three.js", + ResourceLocation.SYSTEM + ).invoke(this) + }.finalize() + + + //println(string) + } +} \ No newline at end of file -- 2.34.1 From 35fc7a70426167d457ad0d09a62212b614e7ef15 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 17 Jan 2023 19:20:48 +0300 Subject: [PATCH 112/143] Update threejs server --- build.gradle.kts | 2 +- .../build.gradle.kts | 12 +++++++--- .../kscience/visionforge/three/jsMain.kt | 4 ++-- .../webpack.config.d/01.ring.js | 23 +++++++++++++++++++ .../webpack.config.d/02.bundle.js | 10 ++++++++ 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js create mode 100644 visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js diff --git a/build.gradle.kts b/build.gradle.kts index 5a82b18c..c9ee8e6d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-5" + version = "0.3.0-dev-7" } subprojects { diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 7623086d..d3ef8496 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -10,6 +10,11 @@ kotlin { webpackTask { this.outputFileName = "js/visionforge-three.js" } + commonWebpackConfig { + cssSupport{ + enabled.set(false) + } + } } binaries.executable() } @@ -17,17 +22,18 @@ kotlin { sourceSets { commonMain { dependencies { - api(project(":visionforge-solid")) + api(projects.visionforgeSolid) } } jvmMain { dependencies { - api(project(":visionforge-server")) + api(projects.visionforgeServer) } } jsMain { dependencies { - api(project(":visionforge-threejs")) + api(projects.visionforgeThreejs) + api(projects.ui.ring) } } } diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index ed2908f5..d1635ddf 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -1,11 +1,11 @@ package space.kscience.visionforge.three import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient -import space.kscience.visionforge.solid.three.ThreePlugin @DFExperimental public fun main(): Unit = runVisionClient { - plugin(ThreePlugin) + plugin(ThreeWithControlsPlugin) } \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js new file mode 100644 index 00000000..b3cc4770 --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js @@ -0,0 +1,23 @@ +const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; +const path = require('path'); + +config.module.rules.push(...ringConfig.module.rules) + +config.module.rules.push( + { + test: /\.css$/, + exclude: [ + path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") + ], + use: [ + { + loader: 'style-loader', + options: {} + }, + { + loader: 'css-loader', + options: {} + } + ] + } +) \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js new file mode 100644 index 00000000..947253ca --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js @@ -0,0 +1,10 @@ +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + +module.exports = { + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: "static", + reportFilename: "bundle-report.html" + }) + ] +} \ No newline at end of file -- 2.34.1 From 4ec611eda39ddbfab6d924a813c54dab72250043 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 14 May 2023 18:33:30 +0300 Subject: [PATCH 113/143] Update versions --- build.gradle.kts | 2 +- cern-root-loader/build.gradle.kts | 15 +- demo/gdml/build.gradle.kts | 88 +++++----- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 4 +- .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 166 +++++++++--------- .../src/main/kotlin/JsPlaygroundApp.kt | 6 +- .../src/main/kotlin/plotlyComponent.kt | 4 +- demo/muon-monitor/build.gradle.kts | 86 +++------ .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 6 +- demo/playground/build.gradle.kts | 1 - .../src/jvmMain/kotlin/formServer.kt | 4 +- .../src/jvmMain/kotlin/generateSchema.kt | 1 + demo/sat-demo/build.gradle.kts | 9 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +- demo/solid-showcase/build.gradle.kts | 33 +--- .../visionforge/solid/demo/ThreeDemoGrid.kt | 4 +- .../visionforge/solid/demo/FXDemoApp.kt | 0 .../visionforge/solid/demo/FXDemoGrid.kt | 0 .../visionforge/solid/demo/MetaEditorDemo.kt | 0 gradle.properties | 3 +- jupyter/build.gradle.kts | 23 ++- jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt | 3 - jupyter/src/jvmMain/kotlin/VFForNotebook.kt | 4 +- .../visionforge-jupyter-gdml/build.gradle.kts | 74 +++----- .../src/jsMain/kotlin/gdmlJupyter.kt | 2 +- settings.gradle.kts | 6 +- .../visionforge/react/ThreeCanvasComponent.kt | 4 +- .../ThreeWithControlsPlugin.kt | 2 - visionforge-core/build.gradle.kts | 35 ++-- .../kscience/visionforge/VisionManager.kt | 4 +- .../visionforge/meta/VisionPropertyTest.kt | 13 +- .../kscience/visionforge/VisionClient.kt | 7 +- visionforge-gdml/build.gradle.kts | 23 +-- visionforge-markdown/build.gradle.kts | 17 +- .../visionforge/markup/MarkupPlugin.kt | 2 - .../visionforge/markup/MarkupPlugin.kt | 3 - visionforge-plotly/build.gradle.kts | 19 +- .../kscience/visionforge/plotly/plotlyJs.kt | 4 +- .../kscience/visionforge/plotly/plotlyJvm.kt | 2 - visionforge-server/build.gradle.kts | 18 +- visionforge-solid/build.gradle.kts | 37 ++-- .../space/kscience/visionforge/solid/Solid.kt | 13 +- .../kscience/visionforge/solid/Solids.kt | 6 +- .../visionforge/solid/SolidPluginTest.kt | 4 +- .../visionforge/solid/VisionUpdateTest.kt | 27 +-- visionforge-tables/build.gradle.kts | 29 ++- .../visionforge/tables/TableVisionPlugin.kt | 2 - .../visionforge/tables/TableVisionJsPlugin.kt | 2 - visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 1 - .../build.gradle.kts | 65 ++----- 51 files changed, 359 insertions(+), 530 deletions(-) rename demo/solid-showcase/src/{jvmMain => jvmMain-fx}/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt (100%) rename demo/solid-showcase/src/{jvmMain => jvmMain-fx}/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt (100%) rename demo/solid-showcase/src/{jvmMain => jvmMain-fx}/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt (100%) diff --git a/build.gradle.kts b/build.gradle.kts index c9ee8e6d..62623756 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.6.0-dev-15") +val dataforgeVersion by extra("0.6.1") val fxVersion by extra("11") allprojects { diff --git a/cern-root-loader/build.gradle.kts b/cern-root-loader/build.gradle.kts index 0ea3de8f..fb787187 100644 --- a/cern-root-loader/build.gradle.kts +++ b/cern-root-loader/build.gradle.kts @@ -3,17 +3,12 @@ plugins { } kscience{ + jvm() + js() + dependencies { + api(projects.visionforgeSolid) + } useSerialization { json() } -} - -kotlin { - sourceSets { - val commonMain by getting { - dependencies { - api(project(":visionforge-solid")) - } - } - } } \ No newline at end of file diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 69f56419..3ac3960a 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -1,62 +1,62 @@ -import space.kscience.gradle.DependencyConfiguration -import space.kscience.gradle.FXModule - plugins { id("space.kscience.gradle.mpp") - application } kscience { - val fxVersion: String by rootProject.extra - useFx(FXModule.CONTROLS, version = fxVersion, configuration = DependencyConfiguration.IMPLEMENTATION) - application() -} - -kotlin { - jvm { - withJava() - } - + jvm() js { useCommonJs() browser { commonWebpackConfig { - cssSupport{ + cssSupport { enabled.set(false) } } } } - - sourceSets { - commonMain { - dependencies { - implementation(project(":visionforge-solid")) - implementation(project(":visionforge-gdml")) - } - } - jvmMain { - dependencies { - implementation(project(":visionforge-fx")) - implementation("ch.qos.logback:logback-classic:1.2.11") - } - } - jsMain { - dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) - implementation(npm("react-file-drop", "3.0.6")) - } - } + dependencies { + implementation(projects.visionforgeSolid) + implementation(projects.visionforgeGdml) } + jvmMain { +// implementation(project(":visionforge-fx")) + implementation(spclibs.logback.classic) + } + jsMain { + implementation(projects.ui.ring) + implementation(projects.visionforgeThreejs) + implementation(npm("react-file-drop", "3.0.6")) + } + application() } -application { - mainClass.set("space.kscience.visionforge.gdml.demo.GdmlFxDemoAppKt") -} +//kotlin { +// +// sourceSets { +// commonMain { +// dependencies { +// implementation(project(":visionforge-solid")) +// implementation(project(":visionforge-gdml")) +// } +// } +// jvmMain { +// dependencies { +//// implementation(project(":visionforge-fx")) +// implementation("ch.qos.logback:logback-classic:1.2.11") +// } +// } +// jsMain { +// dependencies { +// implementation(project(":ui:ring")) +// implementation(project(":visionforge-threejs")) +// implementation(npm("react-file-drop", "3.0.6")) +// } +// } +// } +//} -val convertGdmlToJson by tasks.creating(JavaExec::class) { - group = "application" - classpath = sourceSets["main"].runtimeClasspath - mainClass.set("space.kscience.dataforge.vis.spatial.gdml.demo.SaveToJsonKt") -} \ No newline at end of file +//val convertGdmlToJson by tasks.creating(JavaExec::class) { +// group = "application" +// classpath = sourceSets["main"].runtimeClasspath +// mainClass.set("space.kscience.dataforge.vis.spatial.gdml.demo.SaveToJsonKt") +//} \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 5f1d24e1..cdca1957 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.gdml.demo import kotlinx.css.* import org.w3c.dom.Document import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors @@ -54,7 +54,7 @@ private class GDMLDemoApp : Application { } //println(context.plugins.fetch(VisionManager).encodeToString(vision)) attrs { - this.solids = context.fetch(Solids) + this.solids = context.request(Solids) this.vision = vision } } diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index 83e750ba..92cc69aa 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -1,83 +1,83 @@ -package space.kscience.visionforge.gdml.demo - -import javafx.geometry.Orientation -import javafx.scene.Parent -import javafx.stage.FileChooser -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch -import space.kscience.gdml.GdmlShowCase -import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.editor.VisionEditorFragment -import space.kscience.visionforge.editor.VisionTreeFragment -import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.solid.FX3DPlugin -import space.kscience.visionforge.solid.FXCanvas3D -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidMaterial -import tornadofx.* - -class GDMLDemoApp : App(GDMLView::class) - -class GDMLView : View() { - private val context = Context { - plugin(FX3DPlugin) - } - - private val fx3d = context.fetch(FX3DPlugin) - private val visionManager = context.fetch(VisionManager) - private val canvas = FXCanvas3D(fx3d) - - private val treeFragment = VisionTreeFragment().apply { - this.itemProperty.bind(canvas.rootObjectProperty) - } - - private val propertyEditor = VisionEditorFragment().apply { - descriptorProperty.set(SolidMaterial.descriptor) - visionProperty.bind(treeFragment.selectedProperty) - } - - override val root: Parent = borderpane { - top { - buttonbar { - button("Load GDML/json") { - action { - val file = chooseFile("Select a GDML/json file", filters = fileNameFilter).firstOrNull() - if (file != null) { - runAsync { - visionManager.readFile(file) as Solid - } ui { - canvas.render(it) - } - } - } - } - } - } - center { - splitpane(Orientation.HORIZONTAL, treeFragment.root, canvas.root, propertyEditor.root) { - setDividerPositions(0.2, 0.6, 0.2) - } - } - } - - init { - runAsync { - GdmlShowCase.cubes().toVision() - } ui { - canvas.render(it) - } - } - - companion object { - private val fileNameFilter = arrayOf( - FileChooser.ExtensionFilter("GDML", "*.gdml", "*.xml"), - FileChooser.ExtensionFilter("JSON", "*.json"), - FileChooser.ExtensionFilter("JSON.ZIP", "*.json.zip"), - FileChooser.ExtensionFilter("JSON.GZ", "*.json.gz") - ) - } -} - -fun main() { - launch() -} \ No newline at end of file +//package space.kscience.visionforge.gdml.demo +// +//import javafx.geometry.Orientation +//import javafx.scene.Parent +//import javafx.stage.FileChooser +//import space.kscience.dataforge.context.Context +//import space.kscience.dataforge.context.fetch +//import space.kscience.gdml.GdmlShowCase +//import space.kscience.visionforge.VisionManager +//import space.kscience.visionforge.editor.VisionEditorFragment +//import space.kscience.visionforge.editor.VisionTreeFragment +//import space.kscience.visionforge.gdml.toVision +//import space.kscience.visionforge.solid.FX3DPlugin +//import space.kscience.visionforge.solid.FXCanvas3D +//import space.kscience.visionforge.solid.Solid +//import space.kscience.visionforge.solid.SolidMaterial +//import tornadofx.* +// +//class GDMLDemoApp : App(GDMLView::class) +// +//class GDMLView : View() { +// private val context = Context { +// plugin(FX3DPlugin) +// } +// +// private val fx3d = context.fetch(FX3DPlugin) +// private val visionManager = context.fetch(VisionManager) +// private val canvas = FXCanvas3D(fx3d) +// +// private val treeFragment = VisionTreeFragment().apply { +// this.itemProperty.bind(canvas.rootObjectProperty) +// } +// +// private val propertyEditor = VisionEditorFragment().apply { +// descriptorProperty.set(SolidMaterial.descriptor) +// visionProperty.bind(treeFragment.selectedProperty) +// } +// +// override val root: Parent = borderpane { +// top { +// buttonbar { +// button("Load GDML/json") { +// action { +// val file = chooseFile("Select a GDML/json file", filters = fileNameFilter).firstOrNull() +// if (file != null) { +// runAsync { +// visionManager.readFile(file) as Solid +// } ui { +// canvas.render(it) +// } +// } +// } +// } +// } +// } +// center { +// splitpane(Orientation.HORIZONTAL, treeFragment.root, canvas.root, propertyEditor.root) { +// setDividerPositions(0.2, 0.6, 0.2) +// } +// } +// } +// +// init { +// runAsync { +// GdmlShowCase.cubes().toVision() +// } ui { +// canvas.render(it) +// } +// } +// +// companion object { +// private val fileNameFilter = arrayOf( +// FileChooser.ExtensionFilter("GDML", "*.gdml", "*.xml"), +// FileChooser.ExtensionFilter("JSON", "*.json"), +// FileChooser.ExtensionFilter("JSON.ZIP", "*.json.zip"), +// FileChooser.ExtensionFilter("JSON.GZ", "*.json.gz") +// ) +// } +//} +// +//fun main() { +// launch() +//} \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 781aa897..cb6eb3e6 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -3,7 +3,7 @@ import org.w3c.dom.Document import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application @@ -52,7 +52,7 @@ private class JsPlaygroundApp : Application { Tab("gravity") { GravityDemo { attrs { - this.solids = playgroundContext.fetch(Solids) + this.solids = playgroundContext.request(Solids) } } } @@ -73,7 +73,7 @@ private class JsPlaygroundApp : Application { child(ThreeCanvasWithControls) { val random = Random(112233) attrs { - solids = playgroundContext.fetch(Solids) + solids = playgroundContext.request(Solids) solid { ambientLight { color.set(Colors.white) diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index 5a2c6a81..322e80c5 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -20,9 +20,9 @@ val Plotly = fc("Plotly") { props -> useEffect(props.plot, elementRef) { val element = elementRef.current as? HTMLElement ?: error("Plotly element not found") props.plot?.let { - element.plot(it, PlotlyConfig { + element.plot(PlotlyConfig { responsive = true - }) + }, it) } } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index f25c8371..3d814223 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -5,74 +5,46 @@ plugins { group = "ru.mipt.npm" -val ktorVersion: String = npmlibs.versions.ktor.get() +val ktorVersion: String = spclibs.versions.ktor.get() kscience { useCoroutines() useSerialization() + useKtor() + fullStack( + "muon-monitor.js", + jvmConfig = { withJava() }, + jsConfig = { useCommonJs() } + ) { + commonWebpackConfig { + cssSupport { + enabled.set(false) + } + } + } + + commonMain { + implementation(projects.visionforgeSolid) + } + jvmMain { + implementation("org.apache.commons:commons-math3:3.6.1") + implementation("io.ktor:ktor-server-cio:${ktorVersion}") + implementation("io.ktor:ktor-server-content-negotiation:${ktorVersion}") + implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorVersion}") + implementation("ch.qos.logback:logback-classic:1.2.11") + } + jsMain { + implementation(project(":ui:ring")) + implementation(project(":visionforge-threejs")) + //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) + } application() } -kotlin { - jvm { - withJava() - } - js { - useCommonJs() - browser { - commonWebpackConfig { - cssSupport { - enabled.set(false) - } - } - } - } - - sourceSets { - commonMain { - dependencies { - implementation(project(":visionforge-solid")) - } - } - jvmMain { - dependencies { - implementation("org.apache.commons:commons-math3:3.6.1") - implementation("io.ktor:ktor-server-cio:${ktorVersion}") - implementation("io.ktor:ktor-server-content-negotiation:${ktorVersion}") - implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorVersion}") - implementation("ch.qos.logback:logback-classic:1.2.11") - } - } - jsMain { - dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) - //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) - } - } - } -} - application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") } -val jsBrowserDistribution by tasks.getting -val jsBrowserDevelopmentExecutableDistribution by tasks.getting - -val devMode = rootProject.findProperty("visionforge.development") as? Boolean - ?: rootProject.version.toString().contains("dev") - -tasks.getByName("jvmProcessResources") { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - if (devMode) { - dependsOn(jsBrowserDevelopmentExecutableDistribution) - from(jsBrowserDevelopmentExecutableDistribution) - } else { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) - } -} //distributions { // main { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index d28516d0..afc9ce80 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -2,7 +2,7 @@ package ru.mipt.npm.muon.monitor import org.w3c.dom.Document import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager import space.kscience.visionforge.react.createRoot @@ -19,7 +19,7 @@ private class MMDemoApp : Application { plugin(ThreePlugin) } - val visionManager = context.fetch(VisionManager) + val visionManager = context.request(VisionManager) val model = Model(visionManager) @@ -28,7 +28,7 @@ private class MMDemoApp : Application { child(MMApp) { attrs { this.model = model - this.solids = context.fetch(Solids) + this.solids = context.request(Solids) } } } diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 57c6bfd2..fbc0b736 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -29,7 +29,6 @@ kotlin { } jvm { - withJava() compilations.all { kotlinOptions { jvmTarget = "11" diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 461262a5..2f5b4ea1 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -6,7 +6,7 @@ import io.ktor.server.http.content.resources import io.ktor.server.routing.routing import kotlinx.html.* import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionPage @@ -18,7 +18,7 @@ import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage fun main() { - val visionManager = Global.fetch(VisionManager) + val visionManager = Global.request(VisionManager) val connector = EngineConnectorConfig("localhost", 7777) diff --git a/demo/playground/src/jvmMain/kotlin/generateSchema.kt b/demo/playground/src/jvmMain/kotlin/generateSchema.kt index 8331ac62..672cd0b3 100644 --- a/demo/playground/src/jvmMain/kotlin/generateSchema.kt +++ b/demo/playground/src/jvmMain/kotlin/generateSchema.kt @@ -6,6 +6,7 @@ import kotlinx.serialization.json.Json import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.Solids +@OptIn(ExperimentalSerializationApi::class) private val json = Json { serializersModule = Solids.serializersModuleForSolids prettyPrintIndent = " " diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 406591ee..1b37bfad 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -9,15 +9,14 @@ kscience { // json() // } application() + dependencies{ + implementation(projects.visionforgeThreejs.visionforgeThreejsServer) + implementation("ch.qos.logback:logback-classic:1.4.5") + } } group = "ru.mipt.npm" -dependencies{ - implementation(project(":visionforge-threejs:visionforge-threejs-server")) - implementation("ch.qos.logback:logback-classic:1.4.5") -} - application { mainClass.set("ru.mipt.npm.sat.SatServerKt") } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index ed8ae38f..d2c33c2c 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.* import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Null import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors @@ -29,7 +29,7 @@ fun main() { plugin(Solids) } - val solids = satContext.fetch(Solids) + val solids = satContext.request(Solids) //Create a geometry val sat = solids.visionOfSatellite(ySegments = 3).apply { diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index 2da1299f..0a53b4e2 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -1,6 +1,3 @@ -import space.kscience.gradle.DependencyConfiguration -import space.kscience.gradle.FXModule - plugins { id("space.kscience.gradle.mpp") application @@ -8,34 +5,18 @@ plugins { kscience { useCoroutines() - val fxVersion: String by rootProject.extra - useFx(FXModule.CONTROLS, version = fxVersion, configuration = DependencyConfiguration.IMPLEMENTATION) application() -} - -kotlin { - jvm { withJava() } + js() + dependencies { + implementation(projects.visionforgeSolid) + implementation(projects.visionforgeGdml) + } - sourceSets { - commonMain { - dependencies { - implementation(project(":visionforge-solid")) -// implementation(project(":visionforge-gdml")) - } - } - jvmMain { - dependencies { - implementation(project(":visionforge-fx")) - } - } - jsMain { - dependencies { - implementation(project(":visionforge-threejs")) - } - } + jsMain { + implementation(projects.visionforgeThreejs) } } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt index d448349c..50e7f174 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt @@ -10,7 +10,7 @@ import org.w3c.dom.Element import org.w3c.dom.HTMLDivElement import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string @@ -26,7 +26,7 @@ class ThreeDemoGrid(element: Element) : VisionLayout { private val outputs: MutableMap = HashMap() - private val three = Global.fetch(ThreePlugin) + private val three = Global.request(ThreePlugin) override val solids: Solids get() = three.solids diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt b/demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt similarity index 100% rename from demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt rename to demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt b/demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt similarity index 100% rename from demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt rename to demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt b/demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt similarity index 100% rename from demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt rename to demo/solid-showcase/src/jvmMain-fx/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt diff --git a/gradle.properties b/gradle.properties index b80e2265..11c3aafa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,9 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true +kotlin.js.compiler=ir kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.13.4-kotlin-1.8.0 \ No newline at end of file +toolsVersion=0.14.7-kotlin-1.8.20 \ No newline at end of file diff --git a/jupyter/build.gradle.kts b/jupyter/build.gradle.kts index 45aaeaa3..5808f287 100644 --- a/jupyter/build.gradle.kts +++ b/jupyter/build.gradle.kts @@ -1,25 +1,22 @@ plugins { id("space.kscience.gradle.mpp") - id("org.jetbrains.kotlin.jupyter.api") } description = "Common visionforge jupyter module" -kotlin { - sourceSets { - commonMain{ - dependencies{ - api(projects.visionforgeCore) - } - } - jvmMain { - dependencies { - api(projects.visionforgeServer) - } - } +kscience { + jvm() + js() + jupyterLibrary() + dependencies { + api(projects.visionforgeCore) + } + dependencies(jvmMain){ + api(projects.visionforgeServer) } } + readme { maturity = space.kscience.gradle.Maturity.EXPERIMENTAL } \ No newline at end of file diff --git a/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt b/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt index c13586ba..f6a37f23 100644 --- a/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt +++ b/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt @@ -11,7 +11,6 @@ import space.kscience.visionforge.VisionClient import space.kscience.visionforge.renderAllVisions import space.kscience.visionforge.renderAllVisionsById import space.kscience.visionforge.renderAllVisionsIn -import kotlin.reflect.KClass @JsExport public class VFNotebookPlugin : AbstractPlugin() { @@ -44,8 +43,6 @@ public class VFNotebookPlugin : AbstractPlugin() { override fun build(context: Context, meta: Meta): VFNotebookPlugin = VFNotebookPlugin() override val tag: PluginTag = PluginTag(name = "vision.notebook", group = PluginTag.DATAFORGE_GROUP) - - override val type: KClass = VFNotebookPlugin::class } } \ No newline at end of file diff --git a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt index eb61f889..50619e44 100644 --- a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VFForNotebook.kt @@ -4,7 +4,6 @@ import io.ktor.http.URLProtocol import io.ktor.server.application.install import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine -import io.ktor.server.engine.EngineConnectorConfig import io.ktor.server.engine.embeddedServer import io.ktor.server.util.url import io.ktor.server.websocket.WebSockets @@ -25,7 +24,6 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData import space.kscience.visionforge.visionManager @@ -74,7 +72,7 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout } } - val connector: EngineConnectorConfig = EngineConnectorConfig(host, port) + //val connector: EngineConnectorConfig = EngineConnectorConfig(host, port) engine?.stop(1000, 2000) engine = context.embeddedServer(CIO, port, host) { diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index 1198f022..5a67459e 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -4,56 +4,32 @@ plugins { description = "Jupyter api artifact for GDML rendering" -kotlin { - explicitApi = null - js { - useCommonJs() - browser { - webpackTask { - this.outputFileName = "js/gdml-jupyter.js" - } - commonWebpackConfig { - sourceMaps = false - cssSupport{ - enabled.set(false) - } - } - } - binaries.executable() - } - - afterEvaluate { - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) - } - } - - sourceSets { - commonMain { - dependencies { - implementation(projects.visionforgeSolid) - implementation(projects.jupyter) - } - } - jvmMain { - dependencies { - implementation(projects.visionforgeGdml) - } - } - jsMain { - dependencies { - implementation(projects.visionforgeThreejs) - implementation(projects.ui.ring) - } - } - - } -} - kscience { + fullStack("js/gdml-jupyter.js", + jsConfig = { useCommonJs() } + ) { + commonWebpackConfig { + sourceMaps = false + cssSupport { + enabled.set(false) + } + } + } + + dependencies{ + implementation(projects.visionforgeSolid) + implementation(projects.jupyter) + } + + dependencies(jvmMain){ + implementation(projects.visionforgeGdml) + } + + dependencies(jsMain){ + implementation(projects.visionforgeThreejs) + implementation(projects.ui.ring) + } + jupyterLibrary("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") } diff --git a/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt index fef274a2..d4ee507e 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt @@ -6,7 +6,7 @@ import space.kscience.visionforge.runVisionClient @DFExperimental @JsExport -fun main(): Unit = runVisionClient { +public fun main(): Unit = runVisionClient { plugin(ThreeWithControlsPlugin) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 9bdf544a..b9d8bf5b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,7 +34,7 @@ dependencyResolutionManagement { } versionCatalogs { - create("npmlibs") { + create("spclibs") { from("space.kscience:version-catalog:$toolsVersion") } } @@ -48,7 +48,7 @@ include( ":ui:bootstrap", ":visionforge-core", ":visionforge-solid", - ":visionforge-fx", +// ":visionforge-fx", ":visionforge-threejs", ":visionforge-threejs:visionforge-threejs-server", ":visionforge-gdml", @@ -62,7 +62,7 @@ include( ":demo:muon-monitor", ":demo:sat-demo", ":demo:playground", - ":demo:plotly-fx", +// ":demo:plotly-fx", ":demo:js-playground", ":jupyter", ":jupyter:visionforge-jupyter-gdml" diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 4683f579..50c8a60a 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -5,7 +5,7 @@ import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.* import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.specifications.Canvas3DOptions @@ -25,7 +25,7 @@ public val ThreeCanvasComponent: FC = fc("ThreeCanvasComponent val elementRef = useRef(null) var canvas by useState(null) - val three: ThreePlugin = useMemo(props.context) { props.context.fetch(ThreePlugin) } + val three: ThreePlugin = useMemo(props.context) { props.context.request(ThreePlugin) } useEffect(props.solid, props.options, elementRef) { if (canvas == null) { diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index 60f36fb0..dd7f8e0d 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -14,7 +14,6 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.three.ThreePlugin -import kotlin.reflect.KClass public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { public val three: ThreePlugin by require(ThreePlugin) @@ -44,7 +43,6 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.threejs.withControls", PluginTag.DATAFORGE_GROUP) - override val type: KClass = ThreeWithControlsPlugin::class override fun build(context: Context, meta: Meta): ThreeWithControlsPlugin = ThreeWithControlsPlugin() } diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 6a170d02..505ff3be 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -4,29 +4,20 @@ plugins { val dataforgeVersion: String by rootProject.extra -kotlin { - sourceSets { - commonMain { - dependencies { - api("space.kscience:dataforge-context:$dataforgeVersion") - api("org.jetbrains.kotlinx:kotlinx-html:0.8.0") - api("org.jetbrains.kotlin-wrappers:kotlin-css") - } - } - commonTest{ - dependencies{ - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") - } - } - jsMain { - dependencies { - api("org.jetbrains.kotlin-wrappers:kotlin-extensions") - } - } - } -} - kscience{ + jvm() + js() + dependencies { + api("space.kscience:dataforge-context:$dataforgeVersion") + api(spclibs.kotlinx.html) + api("org.jetbrains.kotlin-wrappers:kotlin-css") + } + testDependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") + } + dependencies(jsMain){ + api("org.jetbrains.kotlin-wrappers:kotlin-extensions") + } useSerialization{ json() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 4e64f63a..46266988 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -17,7 +17,6 @@ import space.kscience.visionforge.html.VisionOfCheckbox import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionOfNumberField import space.kscience.visionforge.html.VisionOfTextField -import kotlin.reflect.KClass public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionContainer { override val tag: PluginTag get() = Companion.tag @@ -64,7 +63,6 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont public companion object : PluginFactory { override val tag: PluginTag = PluginTag(name = "vision", group = PluginTag.DATAFORGE_GROUP) - override val type: KClass = VisionManager::class public const val VISION_SERIALIZER_MODULE_TARGET: String = "visionSerializerModule" @@ -110,7 +108,7 @@ public abstract class VisionPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(met /** * Fetch a [VisionManager] from this plugin or create a child plugin with a [VisionManager] */ -public val Context.visionManager: VisionManager get() = fetch(VisionManager) +public val Context.visionManager: VisionManager get() = request(VisionManager ) public fun Vision.encodeToString(): String = manager?.encodeToString(this) ?: error("Orphan vision could not be encoded") diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 08497a57..7b7cdd31 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,12 +1,15 @@ package space.kscience.visionforge.meta -import kotlinx.coroutines.* +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch import kotlinx.coroutines.test.runTest import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.* import space.kscience.visionforge.* import kotlin.test.Test @@ -23,7 +26,7 @@ private class TestScheme : Scheme() { @OptIn(ExperimentalCoroutinesApi::class) internal class VisionPropertyTest { - private val manager = Global.fetch(VisionManager) + private val manager = Global.request(VisionManager) @Test fun testPropertyWrite() { @@ -56,7 +59,7 @@ internal class VisionPropertyTest { @Test fun testChildrenPropertyPropagation() = runTest(dispatchTimeoutMs = 200) { - val group = Global.fetch(VisionManager).group { + val group = Global.request(VisionManager).group { properties { "test" put 11 } @@ -91,7 +94,7 @@ internal class VisionPropertyTest { @Test fun testChildrenPropertyFlow() = runTest(dispatchTimeoutMs = 200) { - val group = Global.fetch(VisionManager).group { + val group = Global.request(VisionManager).group { properties { "test" put 11 diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 6f322268..e87f01fa 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -21,7 +21,6 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOI import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_RENDERED -import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds /** @@ -227,15 +226,13 @@ public class VisionClient : AbstractPlugin() { numberVisionRenderer(this), textVisionRenderer(this), formVisionRenderer(this) - ).toMap() + ).associateByName() } else super.content(target) public companion object : PluginFactory { override fun build(context: Context, meta: Meta): VisionClient = VisionClient() override val tag: PluginTag = PluginTag(name = "vision.client", group = PluginTag.DATAFORGE_GROUP) - - override val type: KClass = VisionClient::class } } @@ -296,7 +293,7 @@ public fun VisionClient.renderAllVisions(): Unit = whenDocumentLoaded { } public class VisionClientApplication(public val context: Context) : Application { - private val client = context.fetch(VisionClient) + private val client = context.request(VisionClient) override fun start(document: Document, state: Map) { context.logger.info { diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 345445da..494e648e 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -2,21 +2,16 @@ plugins { id("space.kscience.gradle.mpp") } -kotlin { - js(IR){ +kscience { + jvm() + js { binaries.library() } - sourceSets { - commonMain{ - dependencies { - api(projects.visionforgeSolid) - api("space.kscience:gdml:0.4.0") - } - } - jvmTest{ - dependencies{ - implementation("ch.qos.logback:logback-classic:1.2.11") - } - } + dependencies { + api(projects.visionforgeSolid) + api("space.kscience:gdml:0.4.0") + } + dependencies(jvmTest) { + implementation("ch.qos.logback:logback-classic:1.2.11") } } \ No newline at end of file diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 2909ab6d..502e2196 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -5,20 +5,13 @@ plugins { val markdownVersion = "0.2.4" kscience { - useSerialization() -} - -kotlin { + jvm() js { binaries.library() } - - sourceSets { - commonMain { - dependencies { - api(project(":visionforge-core")) - api("org.jetbrains:markdown:$markdownVersion") - } - } + dependencies { + api(project(":visionforge-core")) + api("org.jetbrains:markdown:$markdownVersion") } + useSerialization() } \ No newline at end of file diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index ba960eae..08705c27 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -15,7 +15,6 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import space.kscience.visionforge.markup.VisionOfMarkup.Companion.COMMONMARK_FORMAT import space.kscience.visionforge.markup.VisionOfMarkup.Companion.GFM_FORMAT -import kotlin.reflect.KClass public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: VisionClient by require(VisionClient) @@ -47,7 +46,6 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) - override val type: KClass = MarkupPlugin::class override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() diff --git a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 211064ff..de71725c 100644 --- a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -6,7 +6,6 @@ import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.VisionPlugin -import kotlin.reflect.KClass public actual class MarkupPlugin : VisionPlugin() { override val visionSerializersModule: SerializersModule get() = markupSerializersModule @@ -16,8 +15,6 @@ public actual class MarkupPlugin : VisionPlugin() { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) - override val type: KClass = MarkupPlugin::class - override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() } diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index 919dde07..56402f14 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,23 +2,16 @@ plugins { id("space.kscience.gradle.mpp") } -val plotlyVersion = "0.5.3-dev-1" +val plotlyVersion = "0.5.3" kscience { - useSerialization() -} - -kotlin { + jvm() js { binaries.library() } - - sourceSets { - commonMain { - dependencies { - api(project(":visionforge-core")) - api("space.kscience:plotlykt-core:${plotlyVersion}") - } - } + dependencies { + api(project(":visionforge-core")) + api("space.kscience:plotlykt-core:${plotlyVersion}") } + useSerialization() } \ No newline at end of file diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 8344e52e..91518f34 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -14,7 +14,6 @@ import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionClient import space.kscience.visionforge.VisionPlugin -import kotlin.reflect.KClass public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: VisionClient by require(VisionClient) @@ -31,7 +30,7 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) - element.plot(plot, config) + element.plot(config, plot) } override fun content(target: String): Map = when (target) { @@ -41,7 +40,6 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly.js", PluginTag.DATAFORGE_GROUP) - override val type: KClass = PlotlyPlugin::class override fun build(context: Context, meta: Meta): PlotlyPlugin = PlotlyPlugin() diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt index 8fda1d98..b9a8d373 100644 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt +++ b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt @@ -6,7 +6,6 @@ import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.VisionPlugin -import kotlin.reflect.KClass public actual class PlotlyPlugin : VisionPlugin() { @@ -16,7 +15,6 @@ public actual class PlotlyPlugin : VisionPlugin() { public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) - override val type: KClass = PlotlyPlugin::class override fun build(context: Context, meta: Meta): PlotlyPlugin = PlotlyPlugin() diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 236dda78..a4a7d848 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -2,12 +2,14 @@ plugins { id("space.kscience.gradle.jvm") } -val ktorVersion = npmlibs.versions.ktor.get() +kscience{ + useKtor() + dependencies { + api(projects.visionforgeCore) + api("io.ktor:ktor-server-cio") + api("io.ktor:ktor-server-html-builder") + api("io.ktor:ktor-server-websockets") + implementation("io.ktor:ktor-server-cors") + } +} -dependencies { - api(project(":visionforge-core")) - api("io.ktor:ktor-server-cio:${ktorVersion}") - api("io.ktor:ktor-server-html-builder:${ktorVersion}") - api("io.ktor:ktor-server-websockets:${ktorVersion}") - implementation("io.ktor:ktor-server-cors:${ktorVersion}") -} \ No newline at end of file diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index 7a0f145c..d135e045 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -1,35 +1,24 @@ -import space.kscience.gradle.KScienceVersions - plugins { id("space.kscience.gradle.mpp") } -kscience{ - useSerialization{ +kscience { + jvm() + js() + useSerialization { json() } -} - -kotlin { - sourceSets { - commonMain { - dependencies { - api(project(":visionforge-core")) - } - } - commonTest{ - dependencies{ - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${KScienceVersions.coroutinesVersion}") - } - } - jvmTest{ - dependencies{ - implementation("ch.qos.logback:logback-classic:1.2.11") - } - } + dependencies { + api(projects.visionforgeCore) + } + testDependencies { + implementation(spclibs.kotlinx.coroutines.test) + } + dependencies(jvmTest) { + implementation(spclibs.logback.classic) } } -readme{ +readme { maturity = space.kscience.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index b87f0c93..f99e4bbf 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -169,14 +169,19 @@ internal fun float(name: Name, default: Number): ReadWriteProperty = +internal fun point( + name: Name, + defaultX: Float, + defaultY: Float = defaultX, + defaultZ: Float = defaultX, +): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { val item = thisRef.properties.own?.get(name) ?: return null return object : Point3D { - override val x: Float get() = item[X_KEY]?.float ?: default - override val y: Float get() = item[Y_KEY]?.float ?: default - override val z: Float get() = item[Z_KEY]?.float ?: default + override val x: Float get() = item[X_KEY]?.float ?: defaultX + override val y: Float get() = item[Y_KEY]?.float ?: defaultY + override val z: Float get() = item[Z_KEY]?.float ?: defaultZ } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 919ac4cd..62e56d2b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -10,13 +10,12 @@ import kotlinx.serialization.serializer import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput -import kotlin.reflect.KClass public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer { @@ -30,12 +29,11 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer, MutableVisionContainer { override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) - override val type: KClass = Solids::class public val default: Solids by lazy { Context("@Solids") { plugin(Solids) - }.fetch(Solids) + }.request(Solids) } override fun build(context: Context, meta: Meta): Solids = Solids(meta) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt index ad9a06e9..1356c9b6 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPluginTest.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.getChild import kotlin.test.Test @@ -19,7 +19,7 @@ class SolidPluginTest { @DFExperimental @Test fun testPluginConverter() { - val visionManager = Global.fetch(Solids).visionManager + val visionManager = Global.request(Solids).visionManager val meta = visionManager.encodeToMeta(vision) val reconstructed = visionManager.decodeFromMeta(meta) as SolidGroup diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 65fdf373..6a38a194 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.names.asName @@ -12,18 +12,18 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue internal class VisionUpdateTest { - val solidManager = Global.fetch(Solids) + val solidManager = Global.request(Solids) val visionManager = solidManager.visionManager @Test - fun testVisionUpdate(){ + fun testVisionUpdate() { val targetVision = Solids.solidGroup { - box(200,200,200, name = "origin") + box(200, 200, 200, name = "origin") } - val dif = visionManager.VisionChange{ - solidGroup ("top") { + val dif = visionManager.VisionChange { + solidGroup("top") { color.set(123) - box(100,100,100) + box(100, 100, 100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) @@ -31,15 +31,18 @@ internal class VisionUpdateTest { targetVision.update(dif) assertTrue { targetVision.children.getChild("top") is SolidGroup } assertEquals("red", (targetVision.children.getChild("origin") as Solid).color.string) // Should work - assertEquals("#00007b", (targetVision.children.getChild("top") as Solid).color.string) // new item always takes precedence + assertEquals( + "#00007b", + (targetVision.children.getChild("top") as Solid).color.string + ) // new item always takes precedence } @Test - fun testVisionChangeSerialization(){ - val change = visionManager.VisionChange{ + fun testVisionChangeSerialization() { + val change = visionManager.VisionChange { solidGroup("top") { color.set(123) - box(100,100,100) + box(100, 100, 100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) @@ -47,6 +50,6 @@ internal class VisionUpdateTest { val serialized = visionManager.jsonFormat.encodeToString(VisionChange.serializer(), change) println(serialized) val reconstructed = visionManager.jsonFormat.decodeFromString(VisionChange.serializer(), serialized) - assertEquals(change.properties,reconstructed.properties) + assertEquals(change.properties, reconstructed.properties) } } \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index abc56455..23d77912 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -2,13 +2,10 @@ plugins { id("space.kscience.gradle.mpp") } -val tablesVersion = "0.2.0-dev-3" +val tablesVersion = "0.2.0-dev-4" kscience { - useSerialization() -} - -kotlin { + jvm() js { useCommonJs() binaries.library() @@ -20,21 +17,15 @@ kotlin { } } } - - sourceSets { - commonMain { - dependencies { - api(project(":visionforge-core")) - api("space.kscience:tables-kt:${tablesVersion}") - } - } - jsMain { - dependencies { - implementation(npm("tabulator-tables", "5.0.1")) - implementation(npm("@types/tabulator-tables", "5.0.1")) - } - } + dependencies { + api(projects.visionforgeCore) + api("space.kscience:tables-kt:${tablesVersion}") } + dependencies(jsMain){ + implementation(npm("tabulator-tables", "5.0.1")) + implementation(npm("@types/tabulator-tables", "5.0.1")) + } + useSerialization() } readme{ diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt index fd03b550..d6bc9b1d 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt @@ -9,7 +9,6 @@ import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionPlugin -import kotlin.reflect.KClass public class TableVisionPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag @@ -23,7 +22,6 @@ public class TableVisionPlugin : VisionPlugin() { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.table", PluginTag.DATAFORGE_GROUP) - override val type: KClass = TableVisionPlugin::class override fun build(context: Context, meta: Meta): TableVisionPlugin = TableVisionPlugin() } diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 4764069f..d61e4664 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -16,7 +16,6 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionClient import tabulator.Tabulator import tabulator.TabulatorFull -import kotlin.reflect.KClass public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { public val visionClient: VisionClient by require(VisionClient) @@ -89,7 +88,6 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.table.js", PluginTag.DATAFORGE_GROUP) - override val type: KClass = TableVisionJsPlugin::class override fun build(context: Context, meta: Meta): TableVisionJsPlugin = TableVisionJsPlugin() } diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 7cf2a60f..f04275f3 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -10,7 +10,7 @@ kotlin{ } dependencies { - api(project(":visionforge-solid")) + api(projects.visionforgeSolid) implementation(npm("three", "0.143.0")) implementation(npm("three-csg-ts", "3.1.10")) implementation(npm("three.meshline","1.4.0")) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 5aacba18..0a2d9f2a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -158,7 +158,6 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.threejs", PluginTag.DATAFORGE_GROUP) - override val type: KClass = ThreePlugin::class override fun build(context: Context, meta: Meta): ThreePlugin = ThreePlugin() } diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index d3ef8496..059f3784 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -4,55 +4,26 @@ plugins { val ktorVersion: String by rootProject.extra -kotlin { - js(IR) { - browser { - webpackTask { - this.outputFileName = "js/visionforge-three.js" - } - commonWebpackConfig { - cssSupport{ - enabled.set(false) - } - } - } - binaries.executable() - } - - sourceSets { - commonMain { - dependencies { - api(projects.visionforgeSolid) - } - } - jvmMain { - dependencies { - api(projects.visionforgeServer) - } - } - jsMain { - dependencies { - api(projects.visionforgeThreejs) - api(projects.ui.ring) +kscience { + fullStack("js/visionforge-three.js") { + commonWebpackConfig { + cssSupport { + enabled.set(false) } } } -} - -val jsBrowserDistribution by tasks.getting -val jsBrowserDevelopmentExecutableDistribution by tasks.getting - -val devMode = rootProject.findProperty("visionforge.development") as? Boolean - ?: rootProject.version.toString().contains("dev") - -tasks.getByName("jvmProcessResources") { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - if (devMode) { - dependsOn(jsBrowserDevelopmentExecutableDistribution) - from(jsBrowserDevelopmentExecutableDistribution) - } else { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) + dependencies { + api(projects.visionforgeSolid) } -} + + dependencies(jvmMain) { + api(projects.visionforgeServer) + } + + dependencies(jsMain) { + api(projects.visionforgeThreejs) + api(projects.ui.ring) + compileOnly(npm("webpack-bundle-analyzer","4.5.0")) + } +} \ No newline at end of file -- 2.34.1 From c921d5541b8580bf051c19c4a662d000dec6e9f3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 16 May 2023 21:12:24 +0300 Subject: [PATCH 114/143] Cleanup and fix ROOT bug --- .gitignore | 1 - build.gradle.kts | 7 ++ .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 44 +++++----- .../kotlin/ru/mipt/npm/root/rootColor.kt | 2 +- .../ru/mipt/npm/muon/monitor/MMServer.kt | 4 +- .../src/jvmMain/kotlin/rootParser.kt | 83 ++++--------------- visionforge-core/build.gradle.kts | 3 +- .../kscience/visionforge/JvmSynchronized.kt | 5 ++ .../kscience/visionforge/VisionChange.kt | 5 +- .../kscience/visionforge/VisionContainer.kt | 3 +- .../kscience/visionforge/VisionProperties.kt | 3 +- .../kscience/visionforge/JvmSynchronized.kt | 3 + .../kscience/visionforge/html/htmlExport.kt | 4 +- visionforge-gdml/build.gradle.kts | 2 +- visionforge-markdown/build.gradle.kts | 2 +- visionforge-solid/build.gradle.kts | 1 + .../kscience/visionforge/solid/SolidGroup.kt | 7 +- .../kscience/visionforge/solid/Solids.kt | 15 +--- .../visionforge/solid/CompositeTest.kt | 2 +- .../kscience/visionforge/solid/ConvexTest.kt | 2 +- .../kscience/visionforge/solid/GroupTest.kt | 2 +- .../visionforge/solid/SerializationTest.kt | 4 +- .../visionforge/solid/SolidPluginTest.kt | 4 +- .../visionforge/solid/SolidPropertyTest.kt | 4 +- .../visionforge/solid/SolidReferenceTest.kt | 2 +- .../visionforge/solid/VisionUpdateTest.kt | 2 +- .../solid/three/ThreeSphereFactory.kt | 4 +- .../kscience/visionforge/solid/three/csg.kt | 3 +- 28 files changed, 93 insertions(+), 130 deletions(-) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt create mode 100644 visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt diff --git a/.gitignore b/.gitignore index 44f45e0e..6d07da58 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,3 @@ data/ !gradle-wrapper.jar /kotlin-js-store/yarn.lock -. diff --git a/build.gradle.kts b/build.gradle.kts index 62623756..8cedd918 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile import space.kscience.gradle.isInDevelopment import space.kscience.gradle.useApache2Licence import space.kscience.gradle.useSPCTeam @@ -30,6 +31,12 @@ subprojects { freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" } } + + tasks.withType{ + kotlinOptions{ + useEsClasses = true + } + } } ksciencePublish { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index af185db3..8015aea6 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,10 +1,8 @@ package ru.mipt.npm.root -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.doubleArray -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.isEmpty @@ -25,6 +23,8 @@ private data class RootToSolidContext( val prototypeHolder: PrototypeHolder, val currentLayer: Int = 0, val maxLayer: Int = 5, + val ignoreRootColors: Boolean = false, + val colorCache: MutableMap = mutableMapOf(), ) // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix @@ -300,7 +300,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? layer = context.currentLayer val nodes = volume.fNodes - if (nodes.isEmpty() || context.currentLayer >= context.maxLayer) { + if (volume.typename != "TGeoVolumeAssembly" && (nodes.isEmpty() || context.currentLayer >= context.maxLayer)) { //TODO add smart filter volume.fShape?.let { shape -> addShape(shape, context) @@ -326,6 +326,16 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? group.items.values.first().apply { parent = null } } else { group + }.apply { + volume.fMedium?.let { medium -> + color.set(context.colorCache.getOrPut(medium.meta) { RootColors[11 + context.colorCache.size] }) + } + + if (!context.ignoreRootColors) { + volume.fFillColor?.let { + properties[MATERIAL_COLOR_KEY] = RootColors[it] + } + } } } @@ -338,6 +348,7 @@ private fun SolidGroup.addRootVolume( cache: Boolean = true, block: Solid.() -> Unit = {}, ) { + val combinedName = if (volume.fName.isEmpty()) { name } else if (name == null) { @@ -347,12 +358,7 @@ private fun SolidGroup.addRootVolume( } if (!cache) { - val group = buildVolume(volume, context)?.apply { - volume.fFillColor?.let { - properties[MATERIAL_COLOR_KEY] = RootColors[it] - } - block() - } + val group = buildVolume(volume, context)?.apply(block) setChild(combinedName?.let { Name.parse(it) }, group) } else { val templateName = volumesName + volume.name @@ -364,17 +370,17 @@ private fun SolidGroup.addRootVolume( } } - ref(templateName, name).apply { - volume.fFillColor?.let { - properties[MATERIAL_COLOR_KEY] = RootColors[it] - } - block() - } + ref(templateName, name).apply(block) } } -public fun MutableVisionContainer.rootGeo(dGeoManager: DGeoManager): SolidGroup = solidGroup { - val context = RootToSolidContext(this) +public fun MutableVisionContainer.rootGeo( + dGeoManager: DGeoManager, + name: String? = null, + maxLayer: Int = 5, + ignoreRootColors: Boolean = false, +): SolidGroup = solidGroup(name = name?.parseAsName()) { + val context = RootToSolidContext(this, maxLayer = maxLayer, ignoreRootColors = ignoreRootColors) dGeoManager.fNodes.forEach { node -> addRootNode(node, context) } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt index 9ea9c040..9f06125e 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt @@ -1,7 +1,7 @@ package ru.mipt.npm.root public object RootColors { - private val colorMap = Array(924) { "white" } + private val colorMap = MutableList(924) { "white" } //colorMap[110] = "white" diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt index aa533431..b9b8ce4c 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt @@ -23,7 +23,7 @@ import ru.mipt.npm.muon.monitor.sim.Cos2TrackGenerator import ru.mipt.npm.muon.monitor.sim.simulateOne import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.context.request import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.solid.Solids import java.awt.Desktop @@ -36,7 +36,7 @@ private val generator = Cos2TrackGenerator(JDKRandomGenerator(223)) fun Application.module(context: Context = Global) { val currentDir = File(".").absoluteFile environment.log.info("Current directory: $currentDir") - val solidManager = context.fetch(Solids) + val solidManager = context.request(Solids) install(ContentNegotiation) { json() diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 1a4330f4..be70faf8 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -7,9 +7,14 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.meta.string +import space.kscience.visionforge.Colors +import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids -import java.nio.file.Paths +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.solid import java.util.zip.ZipInputStream +import kotlin.io.path.Path import kotlin.io.path.writeText @@ -34,73 +39,17 @@ fun main() { println(it) } - val solid = Solids.rootGeo(geo) - - Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) - //println(Solids.encodeToString(solid)) - - makeVisionFile { + makeVisionFile(path = Path("data/output.html"), resourceLocation = ResourceLocation.EMBED) { vision("canvas") { requirePlugin(Solids) - solid + solid { + ambientLight { + color.set(Colors.white) + } + rootGeo(geo,"BM@N", maxLayer = 3, ignoreRootColors = true).also { + Path("data/BM@N.vf.json").writeText(Solids.encodeToString(it)) + } + } } } -} - - -/* SolidGroup { - set( - "Coil", - solid.getPrototype("Coil".asName())!!.apply { - parent = null - } - ) - *//* group("Shade") { - y = 200 - color("red") - coneSurface( - bottomOuterRadius = 135, - bottomInnerRadius = 25, - height = 50, - topOuterRadius = 135, - topInnerRadius = 25, - angle = 1.5707964 - ) { - position = Point3D(79.6, 0, -122.1) - rotation = Point3D(-1.5707964, 0, 0) - } - coneSurface( - bottomOuterRadius = 135, - bottomInnerRadius = 25, - height = 50, - topOuterRadius = 135, - topInnerRadius = 25, - angle = 1.5707964 - ) { - position = Point3D(-79.6, 0, -122.1) - rotation = Point3D(1.5707964, 0, -3.1415927) - } - coneSurface( - bottomOuterRadius = 135, - bottomInnerRadius = 25, - height = 50, - topOuterRadius = 135, - topInnerRadius = 25, - angle = 1.5707964 - ) { - position = Point3D(79.6, 0, 122.1) - rotation = Point3D(1.5707964, 0, 0) - } - coneSurface( - bottomOuterRadius = 135, - bottomInnerRadius = 25, - height = 50, - topOuterRadius = 135, - topInnerRadius = 25, - angle = 1.5707964 - ) { - position = Point3D(-79.6, 0, 122.1) - rotation = Point3D(-1.5707964, 0, -3.1415927) - } - }*//* - }*/ +} \ No newline at end of file diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 505ff3be..218a1710 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -7,10 +7,11 @@ val dataforgeVersion: String by rootProject.extra kscience{ jvm() js() + native() dependencies { api("space.kscience:dataforge-context:$dataforgeVersion") api(spclibs.kotlinx.html) - api("org.jetbrains.kotlin-wrappers:kotlin-css") +// api("org.jetbrains.kotlin-wrappers:kotlin-css") } testDependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt new file mode 100644 index 00000000..a6f8c374 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt @@ -0,0 +1,5 @@ +package space.kscience.visionforge + +@OptIn(ExperimentalMultiplatform::class) +@OptionalExpectation +public expect annotation class JvmSynchronized() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 358e72aa..15d59a0f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -13,7 +13,6 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.plus -import kotlin.jvm.Synchronized import kotlin.time.Duration /** @@ -59,11 +58,11 @@ public class VisionChangeBuilder : MutableVisionContainer { public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() - @Synchronized + @JvmSynchronized private fun getOrPutChild(visionName: Name): VisionChangeBuilder = children.getOrPut(visionName) { VisionChangeBuilder() } - @Synchronized + @JvmSynchronized internal fun reset() { vision = null propertyChange = MutableMeta() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index 7ac01b74..77f989f4 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import space.kscience.dataforge.names.* import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY -import kotlin.jvm.Synchronized @DslMarker public annotation class VisionBuilder @@ -132,7 +131,7 @@ internal abstract class VisionChildrenImpl( abstract var items: MutableMap? - @Synchronized + @JvmSynchronized private fun buildItems(): MutableMap { if (items == null) { items = LinkedHashMap() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 52bdd52f..2fa88248 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.names.* -import kotlin.jvm.Synchronized public interface VisionProperties { @@ -155,7 +154,7 @@ public abstract class AbstractVisionProperties( override val own: Meta? get() = properties - @Synchronized + @JvmSynchronized protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { //TODO check performance issues diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt new file mode 100644 index 00000000..fc8fed09 --- /dev/null +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/JvmSynchronized.kt @@ -0,0 +1,3 @@ +package space.kscience.visionforge + +public actual typealias JvmSynchronized = Synchronized \ No newline at end of file diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index ff0c3eee..f1efe1b4 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -67,9 +67,7 @@ public fun VisionPage.makeFile( path: Path?, fileHeaders: ((Path) -> Map)? = null, ): Path { - val actualFile = path?.let { - Path.of(System.getProperty("user.home")).resolve(path) - } ?: Files.createTempFile("tempPlot", ".html") + val actualFile = path ?: Files.createTempFile("tempPlot", ".html") val actualDefaultHeaders = fileHeaders?.invoke(actualFile) val actualHeaders = if (actualDefaultHeaders == null) pageHeaders else actualDefaultHeaders + pageHeaders diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 494e648e..6dd3042a 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -12,6 +12,6 @@ kscience { api("space.kscience:gdml:0.4.0") } dependencies(jvmTest) { - implementation("ch.qos.logback:logback-classic:1.2.11") + implementation(spclibs.logback.classic) } } \ No newline at end of file diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 502e2196..9790bf1a 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("space.kscience.gradle.mpp") } -val markdownVersion = "0.2.4" +val markdownVersion = "0.4.1" kscience { jvm() diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index d135e045..5eb92323 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -5,6 +5,7 @@ plugins { kscience { jvm() js() + native() useSerialization { json() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index a089bf4d..f601a30e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -6,7 +6,10 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.parseAsName -import space.kscience.visionforge.* +import space.kscience.visionforge.AbstractVisionGroup +import space.kscience.visionforge.MutableVisionContainer +import space.kscience.visionforge.MutableVisionGroup +import space.kscience.visionforge.VisionBuilder /** @@ -53,7 +56,7 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable /** * Get a prototype redirecting the request to the parent if prototype is not found. - * If prototype is a ref, then it is unfolded automatically. + * If a prototype is a ref, then it is unfolded automatically. */ override fun getPrototype(name: Name): Solid? = prototypes?.get(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 62e56d2b..38d214bd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -10,7 +10,6 @@ import kotlinx.serialization.serializer import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag -import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -27,15 +26,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer, MutableVisionContainer { + public companion object : PluginFactory { override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) - public val default: Solids by lazy { - Context("@Solids") { - plugin(Solids) - }.request(Solids) - } - override fun build(context: Context, meta: Meta): Solids = Solids(meta) private fun PolymorphicModuleBuilder.solids() { @@ -79,9 +72,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer(Sphere::class) { override fun buildGeometry(obj: Sphere): BufferGeometry { - return obj.detail?.let {detail -> + return obj.detail?.let { detail -> SphereGeometry( radius = obj.radius, phiStart = obj.phiStart, @@ -17,7 +17,7 @@ public object ThreeSphereFactory : ThreeMeshFactory(Sphere::class) { widthSegments = detail, heightSegments = detail ) - }?: SphereGeometry( + } ?: SphereGeometry( radius = obj.radius, phiStart = obj.phiStart, phiLength = obj.phi, diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt index 940d72c3..0d7f774d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt @@ -3,8 +3,7 @@ "OVERRIDING_FINAL_MEMBER", "RETURN_TYPE_MISMATCH_ON_OVERRIDE", "CONFLICTING_OVERLOADS", - "EXTERNAL_DELEGATION", - "NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING" + "EXTERNAL_DELEGATION" ) @file:JsModule("three-csg-ts") -- 2.34.1 From c48e5aac25382c33061dc370292609898d532aff Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 29 May 2023 09:53:56 +0300 Subject: [PATCH 115/143] build update and minor API changes --- build.gradle.kts | 3 ++- demo/playground/build.gradle.kts | 2 +- gradle.properties | 3 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 2 +- .../kscience/visionforge/VisionChange.kt | 17 +++++++++++++- .../visionforge/meta/VisionPropertyTest.kt | 3 ++- .../kscience/visionforge/VisionClient.kt | 22 ++++++++++++++----- .../kscience/visionforge/html/htmlExport.kt | 2 +- visionforge-plotly/build.gradle.kts | 2 +- .../visionforge/solid/SolidPropertyTest.kt | 3 ++- 11 files changed, 45 insertions(+), 16 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8cedd918..3ee913b2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-7" + version = "0.3.0-dev-8" } subprojects { @@ -24,6 +24,7 @@ subprojects { maven("https://repo.kotlin.link") mavenCentral() maven("https://maven.jzy3d.org/releases") + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } tasks.withType { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index fbc0b736..a2696fa6 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -65,7 +65,7 @@ kotlin { val jvmMain by getting { dependencies { implementation(projects.visionforgeServer) - implementation("ch.qos.logback:logback-classic:1.2.3") + implementation(spclibs.logback.classic) implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } diff --git a/gradle.properties b/gradle.properties index 11c3aafa..75046b66 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,5 @@ kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.14.7-kotlin-1.8.20 \ No newline at end of file +toolsVersion=0.14.8-kotlin-1.8.20 +org.jetbrains.compose.experimental.jscanvas.enabled=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 070cb702..fae08049 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index b9d8bf5b..e9e3deba 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,6 @@ rootProject.name = "visionforge" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -enableFeaturePreview("VERSION_CATALOGS") pluginManagement { @@ -46,6 +45,7 @@ include( ":ui:ring", // ":ui:material", ":ui:bootstrap", +// ":ui:compose", ":visionforge-core", ":visionforge-solid", // ":visionforge-fx", diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 15d59a0f..847368f3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -41,7 +41,6 @@ public object NullVision : Vision { override val properties: MutableVisionProperties get() = error("Can't get properties of `NullVision`") override val descriptor: MetaDescriptor? = null - } @@ -89,6 +88,12 @@ public class VisionChangeBuilder : MutableVisionContainer { } } + private fun build(visionManager: VisionManager): VisionChange = VisionChange( + vision, + if (propertyChange.isEmpty()) null else propertyChange, + if (children.isEmpty()) null else children.mapValues { it.value.build(visionManager) } + ) + /** * Isolate collected changes by creating detached copies of given visions */ @@ -97,6 +102,13 @@ public class VisionChangeBuilder : MutableVisionContainer { if (propertyChange.isEmpty()) null else propertyChange.seal(), if (children.isEmpty()) null else children.mapValues { it.value.deepCopy(visionManager) } ) + + /** + * Transform current change directly to Json string without protective copy + */ + public fun toJsonString(visionManager: VisionManager): String = visionManager.encodeToString( + build(visionManager) + ) } /** @@ -115,6 +127,9 @@ public inline fun VisionManager.VisionChange(block: VisionChangeBuilder.() -> Un VisionChangeBuilder().apply(block).deepCopy(this) +/** + * Collect changes that are made to [source] to [collector] using [mutex] as a synchronization lock. + */ private fun CoroutineScope.collectChange( name: Name, source: Vision, diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 7b7cdd31..6e113f7f 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -15,6 +15,7 @@ import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals +import kotlin.time.Duration.Companion.milliseconds private class TestScheme : Scheme() { @@ -58,7 +59,7 @@ internal class VisionPropertyTest { } @Test - fun testChildrenPropertyPropagation() = runTest(dispatchTimeoutMs = 200) { + fun testChildrenPropertyPropagation() = runTest(timeout = 200.milliseconds) { val group = Global.request(VisionManager).group { properties { "test" put 11 diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index e87f01fa..af3cd574 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -6,6 +6,8 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import org.w3c.dom.* import org.w3c.dom.url.URL import space.kscience.dataforge.context.* @@ -30,8 +32,6 @@ public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val visionManager: VisionManager by require(VisionManager) - //private val visionMap = HashMap() - /** * Up-going tree traversal in search for endpoint attribute. If element is null, return window URL */ @@ -61,11 +61,19 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null + private val mutex = Mutex() private val changeCollector = VisionChangeBuilder() + /** + * Communicate vision property changed from rendering engine to model + */ public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { - changeCollector.propertyChanged(visionName, propertyName, item) + context.launch { + mutex.withLock { + changeCollector.propertyChanged(visionName, propertyName, item) + } + } } // public fun visionChanged(name: Name?, child: Vision?) { @@ -131,8 +139,10 @@ public class VisionClient : AbstractPlugin() { delay(feedbackAggregationTime.milliseconds) val change = changeCollector[name] ?: continue if (!change.isEmpty()) { - send(visionManager.encodeToString(change.deepCopy(visionManager))) - change.reset() + mutex.withLock { + send(change.toJsonString(visionManager)) + change.reset() + } } } } @@ -232,7 +242,7 @@ public class VisionClient : AbstractPlugin() { public companion object : PluginFactory { override fun build(context: Context, meta: Meta): VisionClient = VisionClient() - override val tag: PluginTag = PluginTag(name = "vision.client", group = PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag(name = "vision.client.js", group = PluginTag.DATAFORGE_GROUP) } } diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index f1efe1b4..ec31b7b4 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -60,7 +60,7 @@ import java.nio.file.Path /** * Export a [VisionPage] to a file * - * @param fileHeaders additional file-system specific headers. + * @param fileHeaders additional file system specific headers. */ @DFExperimental public fun VisionPage.makeFile( diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index 56402f14..8b0a99d1 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -10,7 +10,7 @@ kscience { binaries.library() } dependencies { - api(project(":visionforge-core")) + api(projects.visionforgeCore) api("space.kscience:plotlykt-core:${plotlyVersion}") } useSerialization() diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 7589ee00..5fa22b86 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.names.asName import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.time.Duration.Companion.milliseconds @OptIn(ExperimentalCoroutinesApi::class) @Suppress("UNUSED_VARIABLE") @@ -26,7 +27,7 @@ class SolidPropertyTest { } @Test - fun testColorUpdate() = runTest(dispatchTimeoutMs = 200) { + fun testColorUpdate() = runTest(timeout = 200.milliseconds) { val box = Box(10.0f, 10.0f, 10.0f) val c = CompletableDeferred() -- 2.34.1 From 33778801b66d3e76ca2912e150d6c7ace27046b2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 29 May 2023 21:38:30 +0300 Subject: [PATCH 116/143] Multiple fixes --- .../mipt/npm/root/serialization/jsonToRoot.kt | 8 +-- demo/gdml/build.gradle.kts | 2 +- demo/js-playground/build.gradle.kts | 2 +- demo/muon-monitor/build.gradle.kts | 1 - demo/playground/build.gradle.kts | 8 ++- demo/playground/notebooks/dynamic-demo.ipynb | 57 +++++++++++++++--- demo/playground/src/jvmMain/kotlin/shapes.kt | 39 ++++++++++++ demo/sat-demo/build.gradle.kts | 1 - .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 7 +-- demo/solid-showcase/build.gradle.kts | 6 +- .../visionforge/solid/demo/VisionLayout.kt | 4 +- gradle.properties | 2 +- .../kscience/visionforge/compose/ThreeJS.kt | 11 ++++ visionforge-core/build.gradle.kts | 12 ++-- .../kscience/visionforge/VisionManager.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 2 +- visionforge-markdown/build.gradle.kts | 3 +- .../visionforge/markup/MarkupPlugin.kt | 5 +- .../visionforge/markup/VisionOfMarkup.kt | 14 +++++ .../visionforge/markup/MarkupPlugin.kt | 2 +- .../visionforge/markup/MarkupPlugin.kt | 7 ++- .../visionforge/plotly/VisionOfPlotly.kt | 6 +- visionforge-solid/build.gradle.kts | 4 +- .../kscience/visionforge/solid/ConeSegment.kt | 60 +++++++++++-------- .../kscience/visionforge/solid/ConeSurface.kt | 8 +-- .../kscience/visionforge/solid/Solids.kt | 3 +- .../solid/three/ThreeConeFactory.kt | 8 +-- .../visionforge/solid/three/ThreePlugin.kt | 2 +- 28 files changed, 207 insertions(+), 79 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/shapes.kt create mode 100644 ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeJS.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index 1685c1ac..c443f646 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -118,7 +118,7 @@ private object RootDecoder { subclass(TGeoCompositeShape.serializer().unref(refCache)) subclass(TGeoShapeAssembly.serializer().unref(refCache)) - default { + defaultDeserializer { if (it == null) { TGeoShape.serializer().unref(refCache) } else { @@ -136,7 +136,7 @@ private object RootDecoder { val unrefed = TGeoMatrix.serializer().unref(refCache) - default { + defaultDeserializer { if (it == null) { unrefed } else { @@ -149,7 +149,7 @@ private object RootDecoder { subclass(TGeoVolumeAssembly.serializer().unref(refCache)) val unrefed = TGeoVolume.serializer().unref(refCache) - default { + defaultDeserializer { if (it == null) { unrefed } else { @@ -163,7 +163,7 @@ private object RootDecoder { subclass(TGeoNodeOffset.serializer().unref(refCache)) val unrefed = TGeoNode.serializer().unref(refCache) - default { + defaultDeserializer { if (it == null) { unrefed } else { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 3ac3960a..c1e3be28 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -7,6 +7,7 @@ kscience { js { useCommonJs() browser { + binaries.executable() commonWebpackConfig { cssSupport { enabled.set(false) @@ -27,7 +28,6 @@ kscience { implementation(projects.visionforgeThreejs) implementation(npm("react-file-drop", "3.0.6")) } - application() } //kotlin { diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index 3368c5ef..86935c51 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -4,13 +4,13 @@ plugins { kscience{ useCoroutines() - application() } kotlin{ js(IR){ useCommonJs() browser { + binaries.executable() commonWebpackConfig { cssSupport{ enabled.set(false) diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 3d814223..2ea4d0eb 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -38,7 +38,6 @@ kscience { implementation(project(":visionforge-threejs")) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } - application() } application { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index a2696fa6..ddc1d6a8 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -2,6 +2,7 @@ plugins { kotlin("multiplatform") kotlin("jupyter.api") id("com.github.johnrengelman.shadow") version "7.1.2" +// application } repositories { @@ -29,6 +30,7 @@ kotlin { } jvm { +// withJava() compilations.all { kotlinOptions { jvmTarget = "11" @@ -88,4 +90,8 @@ val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.ap libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") } -tasks.findByName("shadowJar")?.dependsOn(processJupyterApiResources) \ No newline at end of file +tasks.findByName("shadowJar")?.dependsOn(processJupyterApiResources) + +//application{ +// mainClass.set("space.kscience.visionforge.examples.ShapesKt") +//} \ No newline at end of file diff --git a/demo/playground/notebooks/dynamic-demo.ipynb b/demo/playground/notebooks/dynamic-demo.ipynb index 7200d15b..41289185 100644 --- a/demo/playground/notebooks/dynamic-demo.ipynb +++ b/demo/playground/notebooks/dynamic-demo.ipynb @@ -2,37 +2,73 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "tags": [], "pycharm": { "is_executing": true + }, + "ExecuteTime": { + "end_time": "2023-05-29T15:22:37.933397300Z", + "start_time": "2023-05-29T15:22:37.913872100Z" } }, "outputs": [], - "source": [ - "@file:DependsOn(\"../build/libs/playground-0.3.0-dev-4-all.jar\")" - ] + "source": [] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2023-05-29T15:22:50.486483300Z", + "start_time": "2023-05-29T15:22:50.457485500Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Line_2.jupyter.kts (1:1 - 3) Unresolved reference: vf" + ] + } + ], "source": [ "vf.startServer()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false + }, + "ExecuteTime": { + "end_time": "2023-05-29T15:22:51.410680600Z", + "start_time": "2023-05-29T15:22:51.250779400Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Line_3.jupyter.kts (1:16 - 26) Unresolved reference: coroutines\n", + "Line_3.jupyter.kts (4:1 - 7) Unresolved reference: Plotly\n", + "Line_3.jupyter.kts (5:5 - 12) Unresolved reference: scatter\n", + "Line_3.jupyter.kts (6:9 - 10) Unresolved reference: x\n", + "Line_3.jupyter.kts (7:9 - 10) Unresolved reference: y\n", + "Line_3.jupyter.kts (8:12 - 14) Unresolved reference: vf\n", + "Line_3.jupyter.kts (9:13 - 15) Unresolved reference: vf\n", + "Line_3.jupyter.kts (10:23 - 31) Unresolved reference: isActive\n", + "Line_3.jupyter.kts (11:21 - 26) Unresolved reference: delay\n", + "Line_3.jupyter.kts (12:21 - 22) Unresolved reference: y" + ] + } + ], "source": [ "import kotlinx.coroutines.*\n", "import kotlin.random.Random\n", @@ -84,6 +120,9 @@ "nbconvert_exporter": "", "pygments_lexer": "kotlin", "version": "1.8.0-dev-3517" + }, + "ktnbPluginMetadata": { + "isAddProjectLibrariesToClasspath": false } }, "nbformat": 4, diff --git a/demo/playground/src/jvmMain/kotlin/shapes.kt b/demo/playground/src/jvmMain/kotlin/shapes.kt new file mode 100644 index 00000000..bcd4f73a --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/shapes.kt @@ -0,0 +1,39 @@ +package space.kscience.visionforge.examples + +import kotlin.math.PI +import space.kscience.visionforge.Colors +import space.kscience.visionforge.solid.* + +fun main() = makeVisionFile{ + vision("canvas") { + solid { + ambientLight() + box(100.0, 100.0, 100.0) { + z = -110.0 + color.set("teal") + } + sphere(50.0) { + x = 110 + detail = 16 + color.set("red") + } + tube(50, height = 10, innerRadius = 25, angle = PI) { + y = 110 + detail = 16 + rotationX = PI / 4 + color.set("blue") + } + sphereLayer(50, 40, theta = PI / 2) { + rotationX = -PI * 3 / 4 + z = 110 + color.set(Colors.pink) + } + + + tube(30,20, 20){ + detail = 31 + y = - 220 + } + } + } +} \ No newline at end of file diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 1b37bfad..6afadf27 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -8,7 +8,6 @@ kscience { // useSerialization { // json() // } - application() dependencies{ implementation(projects.visionforgeThreejs.visionforgeThreejsServer) implementation("ch.qos.logback:logback-classic:1.4.5") diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index d2c33c2c..4f0ff70c 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -3,8 +3,7 @@ package ru.mipt.npm.sat import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer -import io.ktor.server.http.content.resources -import io.ktor.server.http.content.static +import io.ktor.server.http.content.staticResources import io.ktor.server.routing.routing import kotlinx.coroutines.* import kotlinx.html.div @@ -41,9 +40,7 @@ fun main() { val server = embeddedServer(CIO, connector.port, connector.host) { routing { - static { - resources() - } + staticResources("", null, null) } visionPage( diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index 0a53b4e2..d588e035 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -1,11 +1,11 @@ plugins { id("space.kscience.gradle.mpp") + `maven-publish` application } kscience { useCoroutines() - application() jvm { withJava() } @@ -22,4 +22,8 @@ kscience { application { mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") +} + +kotlin{ + explicitApi = null } \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt index 9b8c6b98..4b5bdf53 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt @@ -5,8 +5,8 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.solid.Solids -public interface VisionLayout { +interface VisionLayout { val solids: Solids - public fun render(name: Name, vision: V, meta: Meta = Meta.EMPTY) + fun render(name: Name, vision: V, meta: Meta = Meta.EMPTY) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 75046b66..e3a218ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,5 +6,5 @@ kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G -toolsVersion=0.14.8-kotlin-1.8.20 +toolsVersion=0.14.9-kotlin-1.8.20 org.jetbrains.compose.experimental.jscanvas.enabled=true \ No newline at end of file diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeJS.kt b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeJS.kt new file mode 100644 index 00000000..6033c712 --- /dev/null +++ b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeJS.kt @@ -0,0 +1,11 @@ +package space.kscience.visionforge.compose + +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable + +@Composable +public fun ThreeJs(){ + Surface { + + } +} \ No newline at end of file diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 218a1710..f2cac4c6 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -4,26 +4,24 @@ plugins { val dataforgeVersion: String by rootProject.extra -kscience{ +kscience { jvm() js() native() + useCoroutines() dependencies { api("space.kscience:dataforge-context:$dataforgeVersion") api(spclibs.kotlinx.html) // api("org.jetbrains.kotlin-wrappers:kotlin-css") } - testDependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") - } - dependencies(jsMain){ + jsMain { api("org.jetbrains.kotlin-wrappers:kotlin-extensions") } - useSerialization{ + useSerialization { json() } } -readme{ +readme { maturity = space.kscience.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 46266988..2be8a6b3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -70,7 +70,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont private val defaultSerialModule: SerializersModule = SerializersModule { polymorphic(Vision::class) { - default { SimpleVisionGroup.serializer() } + defaultDeserializer { SimpleVisionGroup.serializer() } subclass(NullVision.serializer()) subclass(SimpleVisionGroup.serializer()) subclass(VisionOfNumberField.serializer()) diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 6e113f7f..e9a0685e 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -94,7 +94,7 @@ internal class VisionPropertyTest { } @Test - fun testChildrenPropertyFlow() = runTest(dispatchTimeoutMs = 200) { + fun testChildrenPropertyFlow() = runTest(timeout = 200.milliseconds) { val group = Global.request(VisionManager).group { properties { diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 9790bf1a..36559a09 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -10,8 +10,9 @@ kscience { binaries.library() } dependencies { - api(project(":visionforge-core")) + api(projects.visionforgeCore) api("org.jetbrains:markdown:$markdownVersion") + api("org.jetbrains:annotations:24.0.0") } useSerialization() } \ No newline at end of file diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 7ff98f91..3508ba8b 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -1,5 +1,8 @@ package space.kscience.visionforge.markup +import space.kscience.dataforge.context.PluginFactory import space.kscience.visionforge.VisionPlugin -public expect class MarkupPlugin: VisionPlugin \ No newline at end of file +public expect class MarkupPlugin: VisionPlugin{ + public companion object : PluginFactory +} \ No newline at end of file diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index ace39d2b..f3e255df 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -10,6 +10,8 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.AbstractVision import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.root @Serializable @@ -38,4 +40,16 @@ internal val markupSerializersModule = SerializersModule { polymorphic(Vision::class) { subclass(VisionOfMarkup.serializer()) } +} + +/** + * Embed a dynamic markdown block in a vision + */ +@VisionBuilder +public inline fun VisionOutput.markdown( + format: String = VisionOfMarkup.COMMONMARK_FORMAT, + block: VisionOfMarkup.() -> Unit, +): VisionOfMarkup { + requirePlugin(MarkupPlugin) + return VisionOfMarkup(format).apply(block) } \ No newline at end of file diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 08705c27..e79908f0 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -44,7 +44,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { element.append(div) } - public companion object : PluginFactory { + public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() diff --git a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index de71725c..16cb6b24 100644 --- a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.markup import kotlinx.serialization.modules.SerializersModule +import org.intellij.lang.annotations.Language import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag @@ -12,10 +13,14 @@ public actual class MarkupPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag - public companion object : PluginFactory { + public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() } +} + +public fun VisionOfMarkup.content(@Language("markdown") text: String) { + content = text } \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 54ba4551..10baa4ab 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -16,6 +16,7 @@ import space.kscience.plotly.Plot import space.kscience.plotly.Plotly import space.kscience.visionforge.MutableVisionProperties import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.html.VisionOutput @Serializable @@ -82,7 +83,10 @@ public class VisionOfPlotly private constructor( public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) -@DFExperimental +/** + * Embed a dynamic plotly plot in a vision + */ +@VisionBuilder public inline fun VisionOutput.plotly( block: Plot.() -> Unit, ): VisionOfPlotly { diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index 5eb92323..a1d4fbc4 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -9,12 +9,10 @@ kscience { useSerialization { json() } + useCoroutines() dependencies { api(projects.visionforgeCore) } - testDependencies { - implementation(spclibs.kotlinx.coroutines.test) - } dependencies(jvmTest) { implementation(spclibs.logback.classic) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt index 873ae44e..6e2677af 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt @@ -18,42 +18,54 @@ public class ConeSegment( public val bottomRadius: Float, public val height: Float, public val topRadius: Float, - public val startAngle: Float = 0f, - public val angle: Float = PI2 + public val phiStart: Float = 0f, + public val phi: Float = PI2, ) : SolidBase(), GeometrySolid { - override fun toGeometry(geometryBuilder: GeometryBuilder) { - val segments = detail ?: 32 - require(segments >= 4) { "The number of segments in cone segment is too small" } - val angleStep = angle / (segments - 1) + init { + require(bottomRadius > 0) { "Bottom radius must be positive" } + require(topRadius > 0) { "Top radius must be positive" } + } - fun shape(r: Float, z: Float): List { - return (0 until segments).map { i -> - Point3D(r * cos(startAngle + angleStep * i), r * sin(startAngle + angleStep * i), z) - } + override fun toGeometry(geometryBuilder: GeometryBuilder) { + + val segments: Int = detail ?: 32 + require(segments >= 4) { "The number of segments in cone segment is too small" } + + val angleStep = phi / (segments - 1) + + /** + * Top and bottom shape + */ + fun shape(r: Float, z: Float): List = (0 until segments).map { i -> + Point3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) } - geometryBuilder.apply { + with(geometryBuilder) { + + // top and bottom faces + val bottomOuterPoints: List = shape(topRadius, -height / 2) + val upperOuterPoints: List = shape(bottomRadius, height / 2) - //creating shape in x-y plane with z = 0 - val bottomOuterPoints = shape(topRadius, -height / 2) - val upperOuterPoints = shape(bottomRadius, height / 2) //outer face - (1 until segments).forEach { + for (it in 1 until segments) { face4(bottomOuterPoints[it - 1], bottomOuterPoints[it], upperOuterPoints[it], upperOuterPoints[it - 1]) } - if (angle == PI2) { + //if the cone is closed + if (phi == PI2) { face4(bottomOuterPoints.last(), bottomOuterPoints[0], upperOuterPoints[0], upperOuterPoints.last()) } - val zeroBottom = Point3D(0f, 0f, 0f) - val zeroTop = Point3D(0f, 0f, height) - (1 until segments).forEach { + //top and bottom cups + val zeroBottom = Point3D(0f, 0f, -height / 2) + val zeroTop = Point3D(0f, 0f, height / 2) + for (it in 1 until segments) { face(bottomOuterPoints[it - 1], zeroBottom, bottomOuterPoints[it]) face(upperOuterPoints[it - 1], upperOuterPoints[it], zeroTop) } - if (angle == PI2) { + // closed surface + if (phi == PI2) { face(bottomOuterPoints.last(), zeroBottom, bottomOuterPoints[0]) face(upperOuterPoints.last(), upperOuterPoints[0], zeroTop) } else { @@ -71,7 +83,7 @@ public inline fun MutableVisionContainer.cylinder( r: Number, height: Number, name: String? = null, - block: ConeSegment.() -> Unit = {} + block: ConeSegment.() -> Unit = {}, ): ConeSegment = ConeSegment( r.toFloat(), height.toFloat(), @@ -86,11 +98,11 @@ public inline fun MutableVisionContainer.cone( startAngle: Number = 0f, angle: Number = PI2, name: String? = null, - block: ConeSegment.() -> Unit = {} + block: ConeSegment.() -> Unit = {}, ): ConeSegment = ConeSegment( bottomRadius.toFloat(), height.toFloat(), topRadius = upperRadius.toFloat(), - startAngle = startAngle.toFloat(), - angle = angle.toFloat() + phiStart = startAngle.toFloat(), + phi = angle.toFloat() ).apply(block).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index 0bc023e6..2a6bcdc5 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -38,10 +38,8 @@ public class ConeSurface( require(segments >= 4) { "The number of segments in tube is too small" } val angleStep = angle / (segments - 1) - fun shape(r: Float, z: Float): List { - return (0 until segments).map { i -> - Point3D(r * cos(startAngle + angleStep * i), r * sin(startAngle + angleStep * i), z) - } + fun shape(r: Float, z: Float): List = (0 until segments).map { i -> + Point3D(r * cos(startAngle + angleStep * i), r * sin(startAngle + angleStep * i), z) } geometryBuilder.apply { @@ -50,7 +48,7 @@ public class ConeSurface( val bottomOuterPoints = shape(bottomRadius, -height / 2) val topOuterPoints = shape(topRadius, height / 2) //outer face - (1 until segments).forEach { + for (it in 1 until segments) { face4(bottomOuterPoints[it - 1], bottomOuterPoints[it], topOuterPoints[it], topOuterPoints[it - 1]) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 38d214bd..1fecd450 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -44,6 +44,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer()) } + defaultDeserializer { SolidBase.serializer(serializer()) } solids() } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt index acb81e1f..6b2db845 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt @@ -18,16 +18,16 @@ public object ThreeConeFactory : ThreeMeshFactory(ConeSegment::clas radialSegments = segments, heightSegments = segments, openEnded = false, - thetaStart = obj.startAngle, - thetaLength = obj.angle + thetaStart = obj.phiStart, + thetaLength = obj.phi ) } ?: CylinderGeometry( radiusTop = obj.topRadius, radiusBottom = obj.bottomRadius, height = obj.height, openEnded = false, - thetaStart = obj.startAngle, - thetaLength = obj.angle + thetaStart = obj.phiStart, + thetaLength = obj.phi ) return cylinder.rotateX(PI/2) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 0a2d9f2a..1913e332 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -111,7 +111,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { is Composite -> compositeFactory.build(this, vision, observe) else -> { - //find specialized factory for this type if it is present + //find a specialized factory for this type if it is present val factory: ThreeFactory? = findObjectFactory(vision::class) when { factory != null -> factory.build(this, vision, observe) -- 2.34.1 From f6f74b54f60ecfd5b772b6cd82100fe136a4ba52 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 13:56:14 +0300 Subject: [PATCH 117/143] Fix cone segmenta and cone surface representation --- demo/playground/src/jvmMain/kotlin/shapes.kt | 8 +-- .../kscience/visionforge/solid/ConeSegment.kt | 49 ++++++++----------- .../kscience/visionforge/solid/ConeSurface.kt | 28 +++++------ .../visionforge/solid/three/ThreePlugin.kt | 2 +- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/shapes.kt b/demo/playground/src/jvmMain/kotlin/shapes.kt index bcd4f73a..1c702c5e 100644 --- a/demo/playground/src/jvmMain/kotlin/shapes.kt +++ b/demo/playground/src/jvmMain/kotlin/shapes.kt @@ -1,10 +1,10 @@ package space.kscience.visionforge.examples -import kotlin.math.PI import space.kscience.visionforge.Colors import space.kscience.visionforge.solid.* +import kotlin.math.PI -fun main() = makeVisionFile{ +fun main() = makeVisionFile { vision("canvas") { solid { ambientLight() @@ -30,9 +30,9 @@ fun main() = makeVisionFile{ } - tube(30,20, 20){ + cylinder(30,20, name = "cylinder"){ detail = 31 - y = - 220 + y = -220 } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt index 6e2677af..94ea5eaf 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt @@ -22,60 +22,53 @@ public class ConeSegment( public val phi: Float = PI2, ) : SolidBase(), GeometrySolid { + init { - require(bottomRadius > 0) { "Bottom radius must be positive" } - require(topRadius > 0) { "Top radius must be positive" } + require(bottomRadius > 0) { "Cone segment bottom radius must be positive" } + require(height > 0) { "Cone segment height must be positive" } + require(topRadius >= 0) { "Cone segment top radius must be non-negative" } + //require(startAngle >= 0) + require(phi in (0f..(PI2))) } override fun toGeometry(geometryBuilder: GeometryBuilder) { - - val segments: Int = detail ?: 32 - require(segments >= 4) { "The number of segments in cone segment is too small" } - + val segments = detail ?: 32 + require(segments >= 4) { "The number of segments in cone is too small" } val angleStep = phi / (segments - 1) - /** - * Top and bottom shape - */ fun shape(r: Float, z: Float): List = (0 until segments).map { i -> Point3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) } - with(geometryBuilder) { - - // top and bottom faces - val bottomOuterPoints: List = shape(topRadius, -height / 2) - val upperOuterPoints: List = shape(bottomRadius, height / 2) + geometryBuilder.apply { + //creating shape in x-y plane with z = 0 + val bottomPoints = shape(bottomRadius, -height / 2) + val topPoints = shape(topRadius, height / 2) //outer face for (it in 1 until segments) { - face4(bottomOuterPoints[it - 1], bottomOuterPoints[it], upperOuterPoints[it], upperOuterPoints[it - 1]) + face4(bottomPoints[it - 1], bottomPoints[it], topPoints[it], topPoints[it - 1]) } - //if the cone is closed if (phi == PI2) { - face4(bottomOuterPoints.last(), bottomOuterPoints[0], upperOuterPoints[0], upperOuterPoints.last()) + face4(bottomPoints.last(), bottomPoints[0], topPoints[0], topPoints.last()) } - - //top and bottom cups val zeroBottom = Point3D(0f, 0f, -height / 2) - val zeroTop = Point3D(0f, 0f, height / 2) + val zeroTop = Point3D(0f, 0f, +height / 2) for (it in 1 until segments) { - face(bottomOuterPoints[it - 1], zeroBottom, bottomOuterPoints[it]) - face(upperOuterPoints[it - 1], upperOuterPoints[it], zeroTop) + face(bottomPoints[it - 1], zeroBottom, bottomPoints[it]) + face(topPoints[it - 1], topPoints[it], zeroTop) } - // closed surface if (phi == PI2) { - face(bottomOuterPoints.last(), zeroBottom, bottomOuterPoints[0]) - face(upperOuterPoints.last(), upperOuterPoints[0], zeroTop) + face(bottomPoints.last(), zeroBottom, bottomPoints[0]) + face(topPoints.last(), topPoints[0], zeroTop) } else { - face4(zeroTop, zeroBottom, bottomOuterPoints[0], upperOuterPoints[0]) - face4(zeroTop, zeroBottom, bottomOuterPoints.last(), upperOuterPoints.last()) + face4(zeroTop, zeroBottom, bottomPoints[0], topPoints[0]) + face4(zeroTop, zeroBottom, bottomPoints.last(), topPoints.last()) } } } - } @VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index 2a6bcdc5..75ff2161 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -21,8 +21,8 @@ public class ConeSurface( public val height: Float, public val topRadius: Float, public val topInnerRadius: Float, - public val startAngle: Float = 0f, - public val angle: Float = PI2, + public val phiStart: Float = 0f, + public val phi: Float = PI2, ) : SolidBase(), GeometrySolid { init { @@ -30,16 +30,16 @@ public class ConeSurface( require(height > 0) { "Cone surface height must be positive" } require(bottomInnerRadius >= 0) { "Cone surface bottom inner radius must be non-negative" } //require(startAngle >= 0) - require(angle in (0f..(PI2))) + require(phi in (0f..(PI2))) } override fun toGeometry(geometryBuilder: GeometryBuilder) { val segments = detail ?: 32 require(segments >= 4) { "The number of segments in tube is too small" } - val angleStep = angle / (segments - 1) + val angleStep = phi / (segments - 1) fun shape(r: Float, z: Float): List = (0 until segments).map { i -> - Point3D(r * cos(startAngle + angleStep * i), r * sin(startAngle + angleStep * i), z) + Point3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) } geometryBuilder.apply { @@ -52,17 +52,17 @@ public class ConeSurface( face4(bottomOuterPoints[it - 1], bottomOuterPoints[it], topOuterPoints[it], topOuterPoints[it - 1]) } - if (angle == PI2) { + if (phi == PI2) { face4(bottomOuterPoints.last(), bottomOuterPoints[0], topOuterPoints[0], topOuterPoints.last()) } if (bottomInnerRadius == 0f) { - val zeroBottom = Point3D(0f, 0f, 0f) - val zeroTop = Point3D(0f, 0f, height) + val zeroBottom = Point3D(0f, 0f, -height / 2) + val zeroTop = Point3D(0f, 0f, height / 2) (1 until segments).forEach { face(bottomOuterPoints[it - 1], zeroBottom, bottomOuterPoints[it]) face(topOuterPoints[it - 1], topOuterPoints[it], zeroTop) } - if (angle == PI2) { + if (phi == PI2) { face(bottomOuterPoints.last(), zeroBottom, bottomOuterPoints[0]) face(topOuterPoints.last(), topOuterPoints[0], zeroTop) } else { @@ -96,7 +96,7 @@ public class ConeSurface( topOuterPoints[it] ) } - if (angle == PI2) { + if (phi == PI2) { face4(bottomInnerPoints[0], bottomInnerPoints.last(), topInnerPoints.last(), topInnerPoints[0]) face4( bottomInnerPoints.last(), @@ -135,8 +135,8 @@ public inline fun MutableVisionContainer.tube( height = height.toFloat(), topRadius = radius.toFloat(), topInnerRadius = innerRadius.toFloat(), - startAngle = startAngle.toFloat(), - angle = angle.toFloat() + phiStart = startAngle.toFloat(), + phi = angle.toFloat() ).apply(block).also { setChild(name, it) } @VisionBuilder @@ -156,6 +156,6 @@ public inline fun MutableVisionContainer.coneSurface( height = height.toFloat(), topRadius = topOuterRadius.toFloat(), topInnerRadius = topInnerRadius.toFloat(), - startAngle = startAngle.toFloat(), - angle = angle.toFloat() + phiStart = startAngle.toFloat(), + phi = angle.toFloat() ).apply(block).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 1913e332..234ded6f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -34,7 +34,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[Box::class] = ThreeBoxFactory objectFactories[Convex::class] = ThreeConvexFactory objectFactories[Sphere::class] = ThreeSphereFactory - objectFactories[ConeSegment::class] = ThreeConeFactory +// objectFactories[ConeSegment::class] = ThreeConeFactory objectFactories[PolyLine::class] = ThreeSmartLineFactory objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory -- 2.34.1 From 18c39fc0768ec7a894fa3d03eb93a0dc37e62676 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 17:06:27 +0300 Subject: [PATCH 118/143] Add solids configuration to vision builder --- build.gradle.kts | 2 +- demo/build.gradle.kts | 11 +++ demo/gdml/build.gradle.kts | 4 + .../src/jvmMain/kotlin/formServer.kt | 12 +-- demo/playground/src/jvmMain/kotlin/shapes.kt | 1 + .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 7 +- demo/solid-showcase/build.gradle.kts | 5 -- .../visionforge/server/VisionServer.kt | 85 +++++++++---------- .../server/applicationExtensions.kt | 3 +- .../kscience/visionforge/solid/Solids.kt | 8 +- .../visionforge/solid/three/ThreePlugin.kt | 9 +- 11 files changed, 76 insertions(+), 71 deletions(-) create mode 100644 demo/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 3ee913b2..30eea98f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-8" + version = "0.3.0-dev-9" } subprojects { diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts new file mode 100644 index 00000000..49476bc7 --- /dev/null +++ b/demo/build.gradle.kts @@ -0,0 +1,11 @@ +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper + +subprojects { + plugins.withType { + configure { + explicitApi = ExplicitApiMode.Disabled + } + } +} \ No newline at end of file diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index c1e3be28..72b1b283 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -30,6 +30,10 @@ kscience { } } +kotlin { + explicitApi = null +} + //kotlin { // // sourceSets { diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 2f5b4ea1..d832d85a 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.examples import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer -import io.ktor.server.http.content.resources +import io.ktor.server.http.content.staticResources import io.ktor.server.routing.routing import kotlinx.html.* import space.kscience.dataforge.context.Global @@ -12,21 +12,18 @@ import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.html.bindForm import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage +@Suppress("ExtractKtorModule") fun main() { val visionManager = Global.request(VisionManager) - - val connector = EngineConnectorConfig("localhost", 7777) - - val server = embeddedServer(CIO, connector.port, connector.host) { + val server = embeddedServer(CIO) { routing { - resources() + staticResources("/", null) } val form = VisionOfHtmlForm("form").apply { @@ -36,7 +33,6 @@ fun main() { } visionPage( - connector, visionManager, VisionPage.scriptHeader("js/visionforge-playground.js"), ) { diff --git a/demo/playground/src/jvmMain/kotlin/shapes.kt b/demo/playground/src/jvmMain/kotlin/shapes.kt index 1c702c5e..a338d123 100644 --- a/demo/playground/src/jvmMain/kotlin/shapes.kt +++ b/demo/playground/src/jvmMain/kotlin/shapes.kt @@ -33,6 +33,7 @@ fun main() = makeVisionFile { cylinder(30,20, name = "cylinder"){ detail = 31 y = -220 + z = 15 } } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 4f0ff70c..9e0c8282 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -14,7 +14,6 @@ import space.kscience.dataforge.meta.Null import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.server.EngineConnectorConfig import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage @@ -23,6 +22,7 @@ import space.kscience.visionforge.three.threeJsHeader import kotlin.random.Random +@Suppress("ExtractKtorModule") fun main() { val satContext = Context("sat") { plugin(Solids) @@ -36,15 +36,12 @@ fun main() { color.set(Colors.white) } } - val connector = EngineConnectorConfig("localhost", 7777) - - val server = embeddedServer(CIO, connector.port, connector.host) { + val server = embeddedServer(CIO, port = 7777) { routing { staticResources("", null, null) } visionPage( - connector, solids.visionManager, VisionPage.threeJsHeader, VisionPage.styleSheetHeader("css/styles.css") ) { diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index d588e035..78e7d163 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("space.kscience.gradle.mpp") - `maven-publish` application } @@ -22,8 +21,4 @@ kscience { application { mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") -} - -kotlin{ - explicitApi = null } \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index c05a1834..84a87a65 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -20,7 +20,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* -import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.* @@ -96,7 +95,7 @@ public fun Application.serveVisionData( val vision: Vision = resolveVision(Name.parse(name)) ?: error("Vision with id='$name' not registered") launch { - for(frame in incoming) { + for (frame in incoming) { val data = frame.data.decodeToString() application.log.debug("Received update for $name: \n$data") val change = configuration.visionManager.jsonFormat.decodeFromString( @@ -151,82 +150,82 @@ public fun Application.serveVisionData( public fun Application.visionPage( route: String, configuration: VisionRoute, - connector: EngineConnectorConfig, headers: Collection, + connector: EngineConnectorConfig? = null, visionFragment: HtmlVisionFragment, ) { require(WebSockets) val collector: MutableMap = mutableMapOf() - val html = createHTML().apply { - head { - meta { - charset = "utf-8" - } - headers.forEach { header -> - consumer.header() - } - } - body { - //Load the fragment and remember all loaded visions - visionFragment( - visionManager = configuration.visionManager, - embedData = configuration.dataMode == VisionRoute.Mode.EMBED, - fetchDataUrl = if (configuration.dataMode != VisionRoute.Mode.EMBED) { - url { - host = connector.host - port = connector.port - path(route, "data") - } - } else null, - updatesUrl = if (configuration.dataMode == VisionRoute.Mode.UPDATE) { - url { - protocol = URLProtocol.WS - host = connector.host - port = connector.port - path(route, "ws") - } - } else null, - onVisionRendered = { name, vision -> collector[name] = vision }, - fragment = visionFragment - ) - } - }.finalize() - //serve data serveVisionData(configuration, collector) //filled pages routing { get(route) { - call.respondText(html, ContentType.Text.Html) + val host = connector?.host ?: call.request.host() + val port = connector?.port ?: call.request.port() + call.respondHtml { + head { + meta { + charset = "utf-8" + } + headers.forEach { header -> + consumer.header() + } + } + body { + //Load the fragment and remember all loaded visions + visionFragment( + visionManager = configuration.visionManager, + embedData = configuration.dataMode == VisionRoute.Mode.EMBED, + fetchDataUrl = if (configuration.dataMode != VisionRoute.Mode.EMBED) { + url { + this.host = host + this.port = port + path(route, "data") + } + } else null, + updatesUrl = if (configuration.dataMode == VisionRoute.Mode.UPDATE) { + url { + protocol = URLProtocol.WS + this.host = host + this.port = port + path(route, "ws") + } + } else null, + onVisionRendered = { name, vision -> collector[name] = vision }, + fragment = visionFragment + ) + } + } } } } public fun Application.visionPage( - connector: EngineConnectorConfig, visionManager: VisionManager, vararg headers: HtmlFragment, route: String = "/", + connector: EngineConnectorConfig? = null, configurationBuilder: VisionRoute.() -> Unit = {}, visionFragment: HtmlVisionFragment, ) { val configuration = VisionRoute(route, visionManager).apply(configurationBuilder) - visionPage(route, configuration, connector, listOf(*headers), visionFragment) + visionPage(route, configuration, listOf(*headers), connector, visionFragment) } /** * Render given [VisionPage] at server */ public fun Application.visionPage( - connector: EngineConnectorConfig, page: VisionPage, route: String = "/", + connector: EngineConnectorConfig? = null, configurationBuilder: VisionRoute.() -> Unit = {}, ) { val configuration = VisionRoute(route, page.visionManager).apply(configurationBuilder) - visionPage(route, configuration, connector, page.pageHeaders.values, visionFragment = page.content) + visionPage(route, configuration, page.pageHeaders.values, connector, visionFragment = page.content) } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt index f33b59b2..81f6e3e7 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt @@ -22,7 +22,8 @@ public fun

, B : Any, F : Any> P.require( */ public fun ApplicationEngine.openInBrowser() { val connector = environment.connectors.first() - val uri = URI("http", null, connector.host, connector.port, null, null, null) + val host = if (connector.host == "0.0.0.0") "127.0.0.1" else connector.host + val uri = URI("http", null, host, connector.port, null, null, null) Desktop.getDesktop().browse(uri) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 1fecd450..f828101b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -11,10 +11,10 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput +import space.kscience.visionforge.solid.specifications.Canvas3DOptions public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer { @@ -80,8 +80,10 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer Unit): SolidGroup { +public inline fun VisionOutput.solid(options: Canvas3DOptions? = null, block: SolidGroup.() -> Unit): SolidGroup { requirePlugin(Solids) + options?.let { + meta = options.meta + } return SolidGroup().apply(block) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 234ded6f..d1309849 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -34,7 +34,6 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[Box::class] = ThreeBoxFactory objectFactories[Convex::class] = ThreeConvexFactory objectFactories[Sphere::class] = ThreeSphereFactory -// objectFactories[ConeSegment::class] = ThreeConeFactory objectFactories[PolyLine::class] = ThreeSmartLineFactory objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory @@ -143,7 +142,8 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { internal fun renderSolid( element: Element, vision: Solid, - ): ThreeCanvas = getOrCreateCanvas(element).apply { + options: Canvas3DOptions = Canvas3DOptions(), + ): ThreeCanvas = getOrCreateCanvas(element, options).apply { render(vision) } @@ -151,9 +151,8 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { renderSolid( element, vision as? Solid ?: error("Solid expected but ${vision::class} found"), - ).apply { - options.meta.update(meta) - } + Canvas3DOptions.read(meta) + ) } public companion object : PluginFactory { -- 2.34.1 From d32dc3fa08b60018066776268473738ef457c51f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 17:38:40 +0300 Subject: [PATCH 119/143] Fix markup plugin tag --- .../kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 16cb6b24..b95c291f 100644 --- a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -14,7 +14,7 @@ public actual class MarkupPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag public actual companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() -- 2.34.1 From c4b866f5b55e088b75c99ac7b08b6c6efa4a8341 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 17:55:35 +0300 Subject: [PATCH 120/143] Fix markup plugin. --- .../space/kscience/visionforge/useProperty.kt | 18 +++++++++--------- .../visionforge/markup/MarkupPlugin.kt | 8 +++++++- .../visionforge/markup/MarkupPlugin.kt | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index 4d00f15b..87312f6f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -13,20 +13,20 @@ import kotlin.reflect.KProperty1 /** - * Call [callBack] on initial value of the property and then on all subsequent values after change + * Call [callback] on initial value of the property and then on all subsequent values after change */ public fun Vision.useProperty( propertyName: Name, inherit: Boolean? = null, includeStyles: Boolean? = null, scope: CoroutineScope? = manager?.context, - callBack: (Meta) -> Unit, + callback: (Meta) -> Unit, ): Job { //Pass initial value. - callBack(properties.getProperty(propertyName, inherit, includeStyles)) + callback(properties.getProperty(propertyName, inherit, includeStyles)) return properties.changes.onEach { name -> if (name.startsWith(propertyName)) { - callBack(properties.getProperty(propertyName, inherit, includeStyles)) + callback(properties.getProperty(propertyName, inherit, includeStyles)) } }.launchIn(scope ?: error("Orphan Vision can't observe properties")) } @@ -36,19 +36,19 @@ public fun Vision.useProperty( inherit: Boolean? = null, includeStyles: Boolean? = null, scope: CoroutineScope? = manager?.context, - callBack: (Meta) -> Unit, -): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callBack) + callback: (Meta) -> Unit, +): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callback) public fun V.useProperty( property: KProperty1, scope: CoroutineScope? = manager?.context, - callBack: V.(T) -> Unit, + callback: V.(T) -> Unit, ): Job { //Pass initial value. - callBack(property.get(this)) + callback(property.get(this)) return properties.changes.onEach { name -> if (name.startsWith(property.name.asName())) { - callBack(property.get(this@useProperty)) + callback(property.get(this@useProperty)) } }.launchIn(scope ?: error("Orphan Vision can't observe properties")) } \ No newline at end of file diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index e79908f0..aad66f3f 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -12,6 +12,7 @@ import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.visionforge.* import space.kscience.visionforge.markup.VisionOfMarkup.Companion.COMMONMARK_FORMAT import space.kscience.visionforge.markup.VisionOfMarkup.Companion.GFM_FORMAT @@ -44,8 +45,13 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { element.append(div) } + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("markup".asName() to this) + else -> super.content(target) + } + public actual companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag("vision.markup.js", PluginTag.DATAFORGE_GROUP) override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() diff --git a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index b95c291f..ce094ee9 100644 --- a/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jvmMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -14,7 +14,7 @@ public actual class MarkupPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag public actual companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag("vision.markup.jvm", PluginTag.DATAFORGE_GROUP) override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() -- 2.34.1 From be52551564e7d8732001374283364583470bb91d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 19:37:03 +0300 Subject: [PATCH 121/143] Minor fixes --- .../src/jvmMain/kotlin/allThingsDemo.kt | 17 +++++++++++++---- .../visionforge/html/VisionTagConsumer.kt | 5 +++-- .../space/kscience/visionforge/VisionClient.kt | 6 ++++-- .../space/kscience/visionforge/solid/Solids.kt | 6 +++++- .../visionforge/solid/three/ThreePlugin.kt | 6 +++--- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 328387c1..5b272b72 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 import space.kscience.dataforge.meta.ValueType +import space.kscience.dataforge.meta.invoke import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode import space.kscience.plotly.models.TextPosition @@ -12,13 +13,14 @@ import space.kscience.visionforge.markup.markdown import space.kscience.visionforge.plotly.plotly import space.kscience.visionforge.solid.box import space.kscience.visionforge.solid.solid +import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.z import space.kscience.visionforge.tables.columnTable -import java.nio.file.Paths +import kotlin.io.path.Path fun main() = makeVisionFile( - Paths.get("VisionForgeDemo.html"), + Path("VisionForgeDemo.html"), resourceLocation = ResourceLocation.EMBED ) { markdown { @@ -32,8 +34,15 @@ fun main() = makeVisionFile( h2 { +"3D visualization with Three-js" } vision("3D") { - solid { - box(100, 100, 100, name = "aBox"){ + solid( + Canvas3DOptions { + axes { + size = 200.0 + visible = true + } + } + ) { + box(100, 100, 100, name = "aBox") { z = 50.0 } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 80a7be7e..05bebfc2 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -26,7 +26,7 @@ public annotation class VisionDSL * A placeholder object to attach inline vision builders. */ @VisionDSL -public class VisionOutput @PublishedApi internal constructor(public val context: Context, public val name: Name) { +public class VisionOutput @PublishedApi internal constructor(override val context: Context, public val name: Name): ContextAware { public var meta: Meta = Meta.EMPTY private val requirements: MutableSet> = HashSet() @@ -95,9 +95,10 @@ public abstract class VisionTagConsumer( if (!outputMeta.isEmpty()) { //Hard-code output configuration script { + type = "text/json" attributes["class"] = OUTPUT_META_CLASS unsafe { - +manager.jsonFormat.encodeToString(MetaSerializer, outputMeta) + +("\n" + manager.jsonFormat.encodeToString(MetaSerializer, outputMeta) + "\n") } } } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index af3cd574..7d61ce24 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -176,11 +176,13 @@ public class VisionClient : AbstractPlugin() { } val outputMeta = element.getEmbeddedData(VisionTagConsumer.OUTPUT_META_CLASS)?.let { - VisionManager.defaultJson.decodeFromString(MetaSerializer, it) + VisionManager.defaultJson.decodeFromString(MetaSerializer, it).also { + logger.info { "Output meta for $name: $it" } + } } ?: Meta.EMPTY when { - // fetch data if path is provided + // fetch data if the path is provided element.attributes[OUTPUT_FETCH_ATTRIBUTE] != null -> { val attr = element.attributes[OUTPUT_FETCH_ATTRIBUTE]!! diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index f828101b..4900fc1f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -85,5 +85,9 @@ public inline fun VisionOutput.solid(options: Canvas3DOptions? = null, block: So options?.let { meta = options.meta } - return SolidGroup().apply(block) + return SolidGroup().apply(block).apply { + if (children.values.none { it is LightSource }) { + ambientLight() + } + } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index d1309849..064597e6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -124,7 +124,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public fun getOrCreateCanvas( element: Element, - options: Canvas3DOptions = Canvas3DOptions(), + options: Canvas3DOptions, ): ThreeCanvas = canvasCache.getOrPut(element) { ThreeCanvas(this, element, options) } @@ -142,7 +142,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { internal fun renderSolid( element: Element, vision: Solid, - options: Canvas3DOptions = Canvas3DOptions(), + options: Canvas3DOptions, ): ThreeCanvas = getOrCreateCanvas(element, options).apply { render(vision) } @@ -166,7 +166,7 @@ public fun ThreePlugin.render( element: HTMLElement, obj: Solid, optionsBuilder: Canvas3DOptions.() -> Unit = {}, -): ThreeCanvas = renderSolid(element, obj).apply { +): ThreeCanvas = renderSolid(element, obj, Canvas3DOptions(optionsBuilder)).apply { options.apply(optionsBuilder) } -- 2.34.1 From a872f10523d00d3067ffe0ff42971d6cbb078255 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 May 2023 20:04:23 +0300 Subject: [PATCH 122/143] Minor fixes --- .../space/kscience/visionforge/html/VisionTagConsumer.kt | 2 +- .../kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 05bebfc2..99a8ea0d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -92,6 +92,7 @@ public abstract class VisionTagConsumer( vision.setAsRoot(manager) } attributes[OUTPUT_NAME_ATTRIBUTE] = name.toString() + renderVision(manager, name, vision, outputMeta) if (!outputMeta.isEmpty()) { //Hard-code output configuration script { @@ -102,7 +103,6 @@ public abstract class VisionTagConsumer( } } } - renderVision(manager, name, vision, outputMeta) } /** diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 10baa4ab..f92e7d4d 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -14,6 +14,7 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly +import space.kscience.plotly.PlotlyConfig import space.kscience.visionforge.MutableVisionProperties import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder @@ -88,8 +89,10 @@ public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) */ @VisionBuilder public inline fun VisionOutput.plotly( + config: PlotlyConfig = PlotlyConfig(), block: Plot.() -> Unit, ): VisionOfPlotly { requirePlugin(PlotlyPlugin) + meta = config.meta return VisionOfPlotly(Plotly.plot(block)) } \ No newline at end of file -- 2.34.1 From 38302eac4c73e1de356c31c66bda3c80e6bd122a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Jun 2023 17:55:27 +0300 Subject: [PATCH 123/143] Use KMath-geometry for solids --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 24 ++-- .../npm/root/serialization/rootToSolid.kt | 6 +- demo/js-playground/build.gradle.kts | 1 + demo/muon-monitor/build.gradle.kts | 2 + .../kotlin/ru/mipt/npm/muon/monitor/Event.kt | 4 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 2 +- .../ru/mipt/npm/muon/monitor/Monitor.kt | 14 +-- .../ru/mipt/npm/muon/monitor/MMServer.kt | 7 +- .../ru/mipt/npm/muon/monitor/sim/line.kt | 8 +- .../ru/mipt/npm/muon/monitor/sim/monitor.kt | 2 +- demo/solid-showcase/build.gradle.kts | 2 + .../kscience/visionforge/solid/demo/demo.kt | 5 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 16 +-- visionforge-solid/build.gradle.kts | 3 + .../kscience/visionforge/solid/ConeSegment.kt | 8 +- .../kscience/visionforge/solid/ConeSurface.kt | 8 +- .../kscience/visionforge/solid/Convex.kt | 6 +- .../kscience/visionforge/solid/Extruded.kt | 22 ++-- .../solid/Float32Euclidean2DSpace.kt | 71 +++++++++++ .../solid/Float32Euclidean3DSpace.kt | 113 ++++++++++++++++++ .../visionforge/solid/GeometryBuilder.kt | 16 +-- .../kscience/visionforge/solid/Hexagon.kt | 64 +++++----- .../kscience/visionforge/solid/LightSource.kt | 2 +- .../kscience/visionforge/solid/PolyLine.kt | 9 +- .../space/kscience/visionforge/solid/Solid.kt | 23 ++-- .../kscience/visionforge/solid/Solids.kt | 1 + .../kscience/visionforge/solid/Sphere.kt | 4 +- .../kscience/visionforge/solid/SphereLayer.kt | 4 +- .../kscience/visionforge/solid/geometry.kt | 110 ++++------------- .../kscience/visionforge/solid/ConvexTest.kt | 3 - .../solid/three/ThreeGeometryBuilder.kt | 25 ++-- .../visionforge/three/TestServerExtensions.kt | 1 + 32 files changed, 365 insertions(+), 221 deletions(-) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean2DSpace.kt create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean3DSpace.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 8015aea6..a2e1f70a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -32,12 +32,12 @@ private fun Solid.rotate(rot: DoubleArray) { val xAngle = atan2(-rot[5], rot[8]) val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) + rotation = Float32Vector3D(xAngle, yAngle, zAngle) } private fun Solid.translate(trans: DoubleArray) { val (x, y, z) = trans - position = Point3D(x, y, z) + position = Float32Vector3D(x, y, z) } private fun Solid.useMatrix(matrix: DGeoMatrix?) { @@ -72,7 +72,7 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { val fScale by matrix.meta.doubleArray() translate(fTranslation) rotate(fRotationMatrix) - scale = Point3D(fScale[0], fScale[1], fScale[2]) + scale = Float32Vector3D(fScale[0], fScale[1], fScale[2]) } } } @@ -248,14 +248,14 @@ private fun SolidGroup.addShape( val fDz by shape.meta.double(0.0) //TODO check proper node order - val node1 = Point3D(-fBl1, -fH1, -fDz) - val node2 = Point3D(fBl1, -fH1, -fDz) - val node3 = Point3D(fTl1, fH1, -fDz) - val node4 = Point3D(-fTl1, fH1, -fDz) - val node5 = Point3D(-fBl2, -fH2, fDz) - val node6 = Point3D(fBl2, -fH2, fDz) - val node7 = Point3D(fTl2, fH2, fDz) - val node8 = Point3D(-fTl2, fH2, fDz) + val node1 = Float32Vector3D(-fBl1, -fH1, -fDz) + val node2 = Float32Vector3D(fBl1, -fH1, -fDz) + val node3 = Float32Vector3D(fTl1, fH1, -fDz) + val node4 = Float32Vector3D(-fTl1, fH1, -fDz) + val node5 = Float32Vector3D(-fBl2, -fH2, fDz) + val node6 = Float32Vector3D(fBl2, -fH2, fDz) + val node7 = Float32Vector3D(fTl2, fH2, fDz) + val node8 = Float32Vector3D(-fTl2, fH2, fDz) hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) } @@ -264,7 +264,7 @@ private fun SolidGroup.addShape( val fScale by shape.dObject(::DGeoScale) fShape?.let { scaledShape -> solidGroup(name?.let { Name.parse(it) }) { - scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) + scale = Float32Vector3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) addShape(scaledShape, context) apply(block) } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt index 50a4002a..eb39b8e7 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt @@ -25,12 +25,12 @@ private fun Solid.rotate(rot: DoubleArray) { val xAngle = atan2(-rot[5], rot[8]) val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) + rotation = Float32Vector3D(xAngle, yAngle, zAngle) } private fun Solid.translate(trans: DoubleArray) { val (x, y, z) = trans - position = Point3D(x, y, z) + position = Float32Vector3D(x, y, z) } private fun Solid.useMatrix(matrix: TGeoMatrix?) { @@ -52,7 +52,7 @@ private fun Solid.useMatrix(matrix: TGeoMatrix?) { translate(matrix.fTranslation) rotate(matrix.fRotationMatrix) val (xScale, yScale, zScale) = matrix.fScale - scale = Point3D(xScale, yScale, zScale) + scale = Float32Vector3D(xScale, yScale, zScale) } } } diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index 86935c51..603b921a 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -7,6 +7,7 @@ kscience{ } kotlin{ + explicitApi = null js(IR){ useCommonJs() browser { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 2ea4d0eb..73336f1b 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -40,6 +40,8 @@ kscience { } } +kotlin.explicitApi = null + application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") } diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt index b47c2b66..22a9d2e1 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt @@ -1,9 +1,9 @@ package ru.mipt.npm.muon.monitor import kotlinx.serialization.Serializable -import space.kscience.visionforge.solid.Point3D +import space.kscience.visionforge.solid.Float32Vector3D -typealias Track = List +typealias Track = List /** * diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 1b8eb566..82c20def 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -16,7 +16,7 @@ class Model(val manager: VisionManager) { private fun MutableVisionContainer.pixel(pixel: SC1) { val group = solidGroup(pixel.name) { - position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z) + position = Float32Vector3D(pixel.center.x, pixel.center.y, pixel.center.z) box(pixel.xSize, pixel.ySize, pixel.zSize) label(pixel.name) { z = -Monitor.PIXEL_Z_SIZE / 2 - 5 diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt index 1a8c8aa9..48fe83d1 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt @@ -2,21 +2,21 @@ package ru.mipt.npm.muon.monitor import ru.mipt.npm.muon.monitor.Monitor.PIXEL_XY_SIZE import ru.mipt.npm.muon.monitor.Monitor.PIXEL_Z_SIZE -import space.kscience.visionforge.solid.Point3D -import space.kscience.visionforge.solid.plus +import space.kscience.visionforge.solid.Float32Euclidean3DSpace +import space.kscience.visionforge.solid.Float32Vector3D /** * A single pixel */ class SC1( val name: String, - val center: Point3D, + val center: Float32Vector3D, val xSize: Float = PIXEL_XY_SIZE, val ySize: Float = PIXEL_XY_SIZE, val zSize: Float = PIXEL_Z_SIZE, ) class SC16( val name: String, - val center: Point3D, + val center: Float32Vector3D, ) { /** @@ -109,9 +109,9 @@ class SC16( else -> throw Error() } - val offset = Point3D(-y, x, 0)//rotateDetector(Point3D(x, y, 0.0)); + val offset = Float32Vector3D(-y, x, 0)//rotateDetector(Point3D(x, y, 0.0)); val pixelName = "${name}_${index}" - SC1(pixelName, offset + center) + SC1(pixelName, with(Float32Euclidean3DSpace) { offset + center }) } } } @@ -154,7 +154,7 @@ object Monitor { val x = split[4].toDouble() - 500 val y = split[5].toDouble() - 500 val z = 180 - split[6].toDouble() - SC16(detectorName, Point3D(x, y, z)) + SC16(detectorName, Float32Vector3D(x, y, z)) } else { null } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt index b9b8ce4c..d3d50c5b 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt @@ -10,8 +10,7 @@ import io.ktor.server.application.install import io.ktor.server.application.log import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer -import io.ktor.server.http.content.resources -import io.ktor.server.http.content.static +import io.ktor.server.http.content.staticResources import io.ktor.server.plugins.contentnegotiation.ContentNegotiation import io.ktor.server.response.respond import io.ktor.server.response.respondText @@ -53,9 +52,7 @@ fun Application.module(context: Context = Global) { status = HttpStatusCode.OK ) } - static("/") { - resources() - } + staticResources("/", null) } try { Desktop.getDesktop().browse(URI("http://localhost:8080/index.html")) diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/line.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/line.kt index c2578783..d9492a74 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/line.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/line.kt @@ -5,7 +5,7 @@ import org.apache.commons.math3.geometry.euclidean.threed.Plane import org.apache.commons.math3.geometry.euclidean.threed.Vector3D import ru.mipt.npm.muon.monitor.Monitor.CENTRAL_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.GEOMETRY_TOLERANCE -import space.kscience.visionforge.solid.Point3D +import space.kscience.visionforge.solid.Float32Vector3D /** * Created by darksnake on 11-May-16. @@ -50,12 +50,12 @@ fun makeTrack(x: Double, y: Double, theta: Double, phi: Double): Line { ) } -fun Vector3D.toPoint() = Point3D(x, y, z) +fun Vector3D.toKMathVector() = Float32Vector3D(x, y, z) -fun Line.toPoints(): List { +fun Line.toKMathVectors(): List { val basePoint = basePlane.intersection(this) val bottom = basePoint.subtract(2000.0, direction) val top = basePoint.add(2000.0, direction) - return listOf(bottom.toPoint(), top.toPoint()) + return listOf(bottom.toKMathVector(), top.toKMathVector()) } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/monitor.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/monitor.kt index d2ec7235..e55b74db 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/monitor.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/monitor.kt @@ -43,7 +43,7 @@ fun readEffs(): Map { fun buildEventByTrack(index: Int, track: Line, hitResolver: (Line) -> Collection = defaultHitResolver): Event { - return Event(index, track.toPoints(), hitResolver(track).map { it.name }) + return Event(index, track.toKMathVectors(), hitResolver(track).map { it.name }) } val defaultHitResolver: (Line) -> Collection = { track: Line -> diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index 78e7d163..8f1c370b 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -19,6 +19,8 @@ kscience { } } +kotlin.explicitApi = null + application { mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") } \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index ef009b82..5fdec43b 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -130,7 +130,10 @@ fun VisionLayout.showcase() { color.set(Colors.blue) } repeat(20) { - polyline(Point3D(100, 100, 100), Point3D(-100, -100, -100)) { + polyline( + Float32Vector3D(100, 100, 100), + Float32Vector3D(-100, -100, -100) + ) { thickness = 3.0 rotationX = it * PI2 / 20 color.set(Colors.green) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 58213437..e17248ad 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -248,14 +248,14 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val dyBottom = solid.y1.toDouble() / 2 val dyTop = solid.y2.toDouble() / 2 val dz = solid.z.toDouble() / 2 - val node1 = Point3D(-dxBottom, -dyBottom, -dz) - val node2 = Point3D(dxBottom, -dyBottom, -dz) - val node3 = Point3D(dxBottom, dyBottom, -dz) - val node4 = Point3D(-dxBottom, dyBottom, -dz) - val node5 = Point3D(-dxTop, -dyTop, dz) - val node6 = Point3D(dxTop, -dyTop, dz) - val node7 = Point3D(dxTop, dyTop, dz) - val node8 = Point3D(-dxTop, dyTop, dz) + val node1 = Float32Vector3D(-dxBottom, -dyBottom, -dz) + val node2 = Float32Vector3D(dxBottom, -dyBottom, -dz) + val node3 = Float32Vector3D(dxBottom, dyBottom, -dz) + val node4 = Float32Vector3D(-dxBottom, dyBottom, -dz) + val node5 = Float32Vector3D(-dxTop, -dyTop, dz) + val node6 = Float32Vector3D(dxTop, -dyTop, dz) + val node7 = Float32Vector3D(dxTop, dyTop, dz) + val node8 = Float32Vector3D(-dxTop, dyTop, dz) hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) } diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index a1d4fbc4..f87cef77 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -2,6 +2,8 @@ plugins { id("space.kscience.gradle.mpp") } +val kmathVersion = "0.3.1" + kscience { jvm() js() @@ -11,6 +13,7 @@ kscience { } useCoroutines() dependencies { + api("space.kscience:kmath-geometry:0.3.1") api(projects.visionforgeCore) } dependencies(jvmTest) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt index 94ea5eaf..7b2679cd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSegment.kt @@ -36,8 +36,8 @@ public class ConeSegment( require(segments >= 4) { "The number of segments in cone is too small" } val angleStep = phi / (segments - 1) - fun shape(r: Float, z: Float): List = (0 until segments).map { i -> - Point3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) + fun shape(r: Float, z: Float): List = (0 until segments).map { i -> + Float32Vector3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) } geometryBuilder.apply { @@ -53,8 +53,8 @@ public class ConeSegment( if (phi == PI2) { face4(bottomPoints.last(), bottomPoints[0], topPoints[0], topPoints.last()) } - val zeroBottom = Point3D(0f, 0f, -height / 2) - val zeroTop = Point3D(0f, 0f, +height / 2) + val zeroBottom = Float32Vector3D(0f, 0f, -height / 2) + val zeroTop = Float32Vector3D(0f, 0f, +height / 2) for (it in 1 until segments) { face(bottomPoints[it - 1], zeroBottom, bottomPoints[it]) face(topPoints[it - 1], topPoints[it], zeroTop) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index 75ff2161..8ce9ba8c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -38,8 +38,8 @@ public class ConeSurface( require(segments >= 4) { "The number of segments in tube is too small" } val angleStep = phi / (segments - 1) - fun shape(r: Float, z: Float): List = (0 until segments).map { i -> - Point3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) + fun shape(r: Float, z: Float): List = (0 until segments).map { i -> + Float32Vector3D(r * cos(phiStart + angleStep * i), r * sin(phiStart + angleStep * i), z) } geometryBuilder.apply { @@ -56,8 +56,8 @@ public class ConeSurface( face4(bottomOuterPoints.last(), bottomOuterPoints[0], topOuterPoints[0], topOuterPoints.last()) } if (bottomInnerRadius == 0f) { - val zeroBottom = Point3D(0f, 0f, -height / 2) - val zeroTop = Point3D(0f, 0f, height / 2) + val zeroBottom = Float32Vector3D(0f, 0f, -height / 2) + val zeroTop = Float32Vector3D(0f, 0f, height / 2) (1 until segments).forEach { face(bottomOuterPoints[it - 1], zeroBottom, bottomOuterPoints[it]) face(topOuterPoints[it - 1], topOuterPoints[it], zeroTop) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt index 4d50c2c4..4fa174ac 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.setChild @Serializable @SerialName("solid.convex") -public class Convex(public val points: List) : SolidBase() +public class Convex(public val points: List) : SolidBase() public inline fun MutableVisionContainer.convex( name: String? = null, @@ -15,10 +15,10 @@ public inline fun MutableVisionContainer.convex( ): Convex = ConvexBuilder().apply(action).build().also { setChild(name, it) } public class ConvexBuilder { - private val points = ArrayList() + private val points = ArrayList() public fun point(x: Number, y: Number, z: Number) { - points.add(Point3D(x, y, z)) + points.add(Float32Vector3D(x, y, z)) } public fun build(): Convex { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index faec109b..1a6487b9 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -4,19 +4,23 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.names.Name -import space.kscience.visionforge.* +import space.kscience.kmath.geometry.component1 +import space.kscience.kmath.geometry.component2 +import space.kscience.visionforge.MutableVisionContainer +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.setChild import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin -public typealias Shape2D = List +public typealias Shape2D = List @Serializable -public class Shape2DBuilder(private val points: ArrayList = ArrayList()) { +public class Shape2DBuilder(private val points: ArrayList = ArrayList()) { public fun point(x: Number, y: Number) { - points.add(Point2D(x, y)) + points.add(Float32Vector2D(x, y)) } public infix fun Number.to(y: Number): Unit = point(this, y) @@ -38,7 +42,7 @@ public data class Layer(var x: Float, var y: Float, var z: Float, var scale: Flo @Serializable @SerialName("solid.extrude") public class Extruded( - public val shape: List, + public val shape: List, public val layers: List, ) : SolidBase(), GeometrySolid { @@ -50,18 +54,18 @@ public class Extruded( /** * Expand the shape for specific layers */ - val layers: List> = layers.map { layer -> + val layers: List> = layers.map { layer -> shape.map { (x, y) -> val newX = layer.x + x * layer.scale val newY = layer.y + y * layer.scale - Point3D(newX, newY, layer.z) + Float32Vector3D(newX, newY, layer.z) } } if (layers.size < 2) error("Extruded shape requires more than one layer") var lowerLayer = layers.first() - var upperLayer: List + var upperLayer: List for (i in (1 until layers.size)) { upperLayer = layers[i] @@ -94,7 +98,7 @@ public class Extruded( } public class ExtrudeBuilder( - public var shape: List = emptyList(), + public var shape: List = emptyList(), public var layers: MutableList = ArrayList(), public val properties: MutableMeta = MutableMeta(), ) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean2DSpace.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean2DSpace.kt new file mode 100644 index 00000000..b9a2fdba --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean2DSpace.kt @@ -0,0 +1,71 @@ +package space.kscience.visionforge.solid + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import space.kscience.kmath.geometry.GeometrySpace +import space.kscience.kmath.geometry.Vector2D +import space.kscience.kmath.operations.ScaleOperations +import kotlin.math.pow +import kotlin.math.sqrt + +@Serializable(Float32Euclidean2DSpace.VectorSerializer::class) +public interface Float32Vector2D: Vector2D + + +public object Float32Euclidean2DSpace : + GeometrySpace, + ScaleOperations { + + @Serializable + @SerialName("Float32Vector2D") + private data class Vector2DImpl( + override val x: Float, + override val y: Float, + ) : Float32Vector2D + + public object VectorSerializer : KSerializer { + private val proxySerializer = Vector2DImpl.serializer() + override val descriptor: SerialDescriptor get() = proxySerializer.descriptor + + override fun deserialize(decoder: Decoder): Float32Vector2D = decoder.decodeSerializableValue(proxySerializer) + + override fun serialize(encoder: Encoder, value: Float32Vector2D) { + val vector = value as? Vector2DImpl ?: Vector2DImpl(value.x, value.y) + encoder.encodeSerializableValue(proxySerializer, vector) + } + } + + public fun vector(x: Float, y: Float): Float32Vector2D = + Vector2DImpl(x, y) + + public fun vector(x: Number, y: Number): Float32Vector2D = + vector(x.toFloat(), y.toFloat()) + + override val zero: Float32Vector2D by lazy { vector(0f, 0f) } + + override fun norm(arg: Float32Vector2D): Double = sqrt(arg.x.pow(2) + arg.y.pow(2)).toDouble() + + public fun Float32Vector2D.norm(): Double = norm(this) + + override fun Float32Vector2D.unaryMinus(): Float32Vector2D = vector(-x, -y) + + override fun Float32Vector2D.distanceTo(other: Float32Vector2D): Double = (this - other).norm() + + override fun add(left: Float32Vector2D, right: Float32Vector2D): Float32Vector2D = + vector(left.x + right.x, left.y + right.y) + + override fun scale(a: Float32Vector2D, value: Double): Float32Vector2D = + vector(a.x * value, a.y * value) + + override fun Float32Vector2D.dot(other: Float32Vector2D): Double = + (x * other.x + y * other.y).toDouble() + + public val xAxis: Float32Vector2D = vector(1.0, 0.0) + public val yAxis: Float32Vector2D = vector(0.0, 1.0) +} + +public fun Float32Vector2D(x: Number, y: Number): Float32Vector2D = Float32Euclidean2DSpace.vector(x, y) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean3DSpace.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean3DSpace.kt new file mode 100644 index 00000000..04b3df35 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Float32Euclidean3DSpace.kt @@ -0,0 +1,113 @@ +package space.kscience.visionforge.solid + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import space.kscience.kmath.geometry.GeometrySpace +import space.kscience.kmath.geometry.Vector3D +import space.kscience.kmath.operations.ScaleOperations +import kotlin.math.pow +import kotlin.math.sqrt + +@Serializable(Float32Euclidean3DSpace.VectorSerializer::class) +public interface Float32Vector3D: Vector3D + + +public object Float32Euclidean3DSpace : + GeometrySpace, + ScaleOperations{ + + @Serializable + @SerialName("Float32Vector3D") + private data class Vector3DImpl( + override val x: Float, + override val y: Float, + override val z: Float, + ) : Float32Vector3D + + public object VectorSerializer : KSerializer { + private val proxySerializer = Vector3DImpl.serializer() + override val descriptor: SerialDescriptor get() = proxySerializer.descriptor + + override fun deserialize(decoder: Decoder): Float32Vector3D = decoder.decodeSerializableValue(proxySerializer) + + override fun serialize(encoder: Encoder, value: Float32Vector3D) { + val vector = value as? Vector3DImpl ?: Vector3DImpl(value.x, value.y, value.z) + encoder.encodeSerializableValue(proxySerializer, vector) + } + } + + public fun vector(x: Float, y: Float, z: Float): Float32Vector3D = + Vector3DImpl(x, y, z) + + public fun vector(x: Number, y: Number, z: Number): Float32Vector3D = + vector(x.toFloat(), y.toFloat(), z.toFloat()) + + override val zero: Float32Vector3D by lazy { vector(0.0, 0.0, 0.0) } + + override fun norm(arg: Float32Vector3D): Double = sqrt(arg.x.pow(2) + arg.y.pow(2) + arg.z.pow(2)).toDouble() + + public fun Float32Vector3D.norm(): Double = norm(this) + + override fun Float32Vector3D.unaryMinus(): Float32Vector3D = vector(-x, -y, -z) + + override fun Float32Vector3D.distanceTo(other: Float32Vector3D): Double = (this - other).norm() + + override fun add(left: Float32Vector3D, right: Float32Vector3D): Float32Vector3D = + vector(left.x + right.x, left.y + right.y, left.z + right.z) + + override fun scale(a: Float32Vector3D, value: Double): Float32Vector3D = + vector(a.x * value, a.y * value, a.z * value) + + override fun Float32Vector3D.dot(other: Float32Vector3D): Double = + (x * other.x + y * other.y + z * other.z).toDouble() + + private fun leviCivita(i: Int, j: Int, k: Int): Int = when { + // even permutation + i == 0 && j == 1 && k == 2 -> 1 + i == 1 && j == 2 && k == 0 -> 1 + i == 2 && j == 0 && k == 1 -> 1 + // odd permutations + i == 2 && j == 1 && k == 0 -> -1 + i == 0 && j == 2 && k == 1 -> -1 + i == 1 && j == 0 && k == 2 -> -1 + + else -> 0 + } + + /** + * Compute vector product of [first] and [second]. The basis is assumed to be right-handed. + */ + public fun vectorProduct( + first: Float32Vector3D, + second: Float32Vector3D, + ): Float32Vector3D { + var x = 0.0 + var y = 0.0 + var z = 0.0 + + for (j in (0..2)) { + for (k in (0..2)) { + x += leviCivita(0, j, k) * first[j] * second[k] + y += leviCivita(1, j, k) * first[j] * second[k] + z += leviCivita(2, j, k) * first[j] * second[k] + } + } + + return vector(x, y, z) + } + + /** + * Vector product in a right-handed basis + */ + public infix fun Float32Vector3D.cross(other: Float32Vector3D): Float32Vector3D = vectorProduct(this, other) + + public val xAxis: Float32Vector3D = vector(1.0, 0.0, 0.0) + public val yAxis: Float32Vector3D = vector(0.0, 1.0, 0.0) + public val zAxis: Float32Vector3D = vector(0.0, 0.0, 1.0) +} + +public fun Float32Vector3D(x: Number, y: Number, z: Number): Float32Vector3D = Float32Euclidean3DSpace.vector(x,y,z) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/GeometryBuilder.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/GeometryBuilder.kt index 3cfc5da9..ab24f8ce 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/GeometryBuilder.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/GeometryBuilder.kt @@ -13,17 +13,17 @@ public interface GeometryBuilder { * @param normal optional external normal to the face * @param meta optional additional platform-specific parameters like color or texture index */ - public fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D? = null, meta: Meta = Meta.EMPTY) + public fun face(vertex1: Float32Vector3D, vertex2: Float32Vector3D, vertex3: Float32Vector3D, normal: Float32Vector3D? = null, meta: Meta = Meta.EMPTY) public fun build(): T } public fun GeometryBuilder<*>.face4( - vertex1: Point3D, - vertex2: Point3D, - vertex3: Point3D, - vertex4: Point3D, - normal: Point3D? = null, + vertex1: Float32Vector3D, + vertex2: Float32Vector3D, + vertex3: Float32Vector3D, + vertex4: Float32Vector3D, + normal: Float32Vector3D? = null, meta: Meta = Meta.EMPTY ) { face(vertex1, vertex2, vertex3, normal, meta) @@ -37,9 +37,9 @@ public interface GeometrySolid : Solid { public fun toGeometry(geometryBuilder: GeometryBuilder) } -public fun GeometryBuilder.cap(shape: List, normal: Point3D? = null) { +public fun GeometryBuilder.cap(shape: List, normal: Float32Vector3D? = null) { //FIXME won't work for non-convex shapes - val center = Point3D( + val center = Float32Vector3D( shape.map { it.x }.average(), shape.map { it.y }.average(), shape.map { it.z }.average() diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt index 92f11e1b..12e661eb 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt @@ -7,14 +7,14 @@ import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.setChild public interface Hexagon : GeometrySolid { - public val node1: Point3D - public val node2: Point3D - public val node3: Point3D - public val node4: Point3D - public val node5: Point3D - public val node6: Point3D - public val node7: Point3D - public val node8: Point3D + public val node1: Float32Vector3D + public val node2: Float32Vector3D + public val node3: Float32Vector3D + public val node4: Float32Vector3D + public val node5: Float32Vector3D + public val node6: Float32Vector3D + public val node7: Float32Vector3D + public val node8: Float32Vector3D override fun toGeometry(geometryBuilder: GeometryBuilder) { geometryBuilder.face4(node1, node4, node3, node2) @@ -41,14 +41,14 @@ public class Box( private inline val dy get() = ySize / 2 private inline val dz get() = zSize / 2 - override val node1: Point3D get() = Point3D(-dx, -dy, -dz) - override val node2: Point3D get() = Point3D(dx, -dy, -dz) - override val node3: Point3D get() = Point3D(dx, dy, -dz) - override val node4: Point3D get() = Point3D(-dx, dy, -dz) - override val node5: Point3D get() = Point3D(-dx, -dy, dz) - override val node6: Point3D get() = Point3D(dx, -dy, dz) - override val node7: Point3D get() = Point3D(dx, dy, dz) - override val node8: Point3D get() = Point3D(-dx, dy, dz) + override val node1: Float32Vector3D get() = Float32Vector3D(-dx, -dy, -dz) + override val node2: Float32Vector3D get() = Float32Vector3D(dx, -dy, -dz) + override val node3: Float32Vector3D get() = Float32Vector3D(dx, dy, -dz) + override val node4: Float32Vector3D get() = Float32Vector3D(-dx, dy, -dz) + override val node5: Float32Vector3D get() = Float32Vector3D(-dx, -dy, dz) + override val node6: Float32Vector3D get() = Float32Vector3D(dx, -dy, dz) + override val node7: Float32Vector3D get() = Float32Vector3D(dx, dy, dz) + override val node8: Float32Vector3D get() = Float32Vector3D(-dx, dy, dz) } @VisionBuilder @@ -63,26 +63,26 @@ public inline fun MutableVisionContainer.box( @Serializable @SerialName("solid.hexagon") public class GenericHexagon( - override val node1: Point3D, - override val node2: Point3D, - override val node3: Point3D, - override val node4: Point3D, - override val node5: Point3D, - override val node6: Point3D, - override val node7: Point3D, - override val node8: Point3D, + override val node1: Float32Vector3D, + override val node2: Float32Vector3D, + override val node3: Float32Vector3D, + override val node4: Float32Vector3D, + override val node5: Float32Vector3D, + override val node6: Float32Vector3D, + override val node7: Float32Vector3D, + override val node8: Float32Vector3D, ) : SolidBase(), Hexagon @VisionBuilder public inline fun MutableVisionContainer.hexagon( - node1: Point3D, - node2: Point3D, - node3: Point3D, - node4: Point3D, - node5: Point3D, - node6: Point3D, - node7: Point3D, - node8: Point3D, + node1: Float32Vector3D, + node2: Float32Vector3D, + node3: Float32Vector3D, + node4: Float32Vector3D, + node5: Float32Vector3D, + node6: Float32Vector3D, + node7: Float32Vector3D, + node8: Float32Vector3D, name: String? = null, action: Hexagon.() -> Unit = {}, ): Hexagon = GenericHexagon(node1, node2, node3, node4, node5, node6, node7, node8).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 95aca618..beeb4eb3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -70,6 +70,6 @@ public fun MutableVisionContainer.pointLight( name: String? = null, block: PointLightSource.() -> Unit = {}, ): PointLightSource = PointLightSource().apply(block).also { - it.position = Point3D(x, y, z) + it.position = Float32Vector3D(x, y, z) setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index 0f366dbe..1681f44a 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -3,11 +3,14 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.number -import space.kscience.visionforge.* +import space.kscience.visionforge.MutableVisionContainer +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.root +import space.kscience.visionforge.setChild @Serializable @SerialName("solid.line") -public class PolyLine(public val points: List) : SolidBase() { +public class PolyLine(public val points: List) : SolidBase() { //var lineType by string() public var thickness: Number by properties.root(inherit = false, includeStyles = true).number { DEFAULT_THICKNESS } @@ -19,7 +22,7 @@ public class PolyLine(public val points: List) : SolidBase() @VisionBuilder public fun MutableVisionContainer.polyline( - vararg points: Point3D, + vararg points: Float32Vector3D, name: String? = null, action: PolyLine.() -> Unit = {}, ): PolyLine = PolyLine(points.toList()).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index f99e4bbf..8bd64336 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -174,18 +174,21 @@ internal fun point( defaultX: Float, defaultY: Float = defaultX, defaultZ: Float = defaultX, -): ReadWriteProperty = - object : ReadWriteProperty { - override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { +): ReadWriteProperty = + object : ReadWriteProperty { + override fun getValue(thisRef: Solid, property: KProperty<*>): Float32Vector3D? { val item = thisRef.properties.own?.get(name) ?: return null - return object : Point3D { + //using dynamic property accessor because values could change + return object : Float32Vector3D { override val x: Float get() = item[X_KEY]?.float ?: defaultX override val y: Float get() = item[Y_KEY]?.float ?: defaultY override val z: Float get() = item[Z_KEY]?.float ?: defaultZ + + override fun toString(): String = item.toString() } } - override fun setValue(thisRef: Solid, property: KProperty<*>, value: Point3D?) { + override fun setValue(thisRef: Solid, property: KProperty<*>, value: Float32Vector3D?) { if (value == null) { thisRef.properties.setProperty(name, null) } else { @@ -196,9 +199,9 @@ internal fun point( } } -public var Solid.position: Point3D? by point(POSITION_KEY, 0f) -public var Solid.rotation: Point3D? by point(ROTATION_KEY, 0f) -public var Solid.scale: Point3D? by point(SCALE_KEY, 1f) +public var Solid.position: Float32Vector3D? by point(POSITION_KEY, 0f) +public var Solid.rotation: Float32Vector3D? by point(ROTATION_KEY, 0f) +public var Solid.scale: Float32Vector3D? by point(SCALE_KEY, 1f) public var Solid.x: Number by float(X_POSITION_KEY, 0f) public var Solid.y: Number by float(Y_POSITION_KEY, 0f) @@ -208,10 +211,10 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f) public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f) public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) -public var Solid.quaternion: Pair? +public var Solid.quaternion: Pair? get() = properties.getValue(Solid.QUATERNION_KEY)?.list?.let { require(it.size == 4) { "Quaternion must be a number array of 4 elements" } - it[0].float to Point3D(it[1].float, it[2].float, it[3].float) + it[0].float to Float32Vector3D(it[1].float, it[2].float, it[3].float) } set(value) { properties.setValue( diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 4900fc1f..ab9fde1e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -51,6 +51,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer(), GeometrySolid { override fun toGeometry(geometryBuilder: GeometryBuilder) { - fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Point3D { + fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Float32Vector3D { // This transformation matches three.js sphere implementation val y = r * cos(theta) val z = r * sin(theta) * sin(phi) val x = -r * sin(theta) * cos(phi) - return Point3D(x, y, z) + return Float32Vector3D(x, y, z) } val segments = this.detail ?: 32 diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt index bb630772..fa025df2 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SphereLayer.kt @@ -27,12 +27,12 @@ public class SphereLayer( require(outerRadius > 0) { "Outer radius must be positive" } require(innerRadius >= 0) { "inner radius must be non-negative" } - fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Point3D { + fun point3dFromSphCoord(r: Float, theta: Float, phi: Float): Float32Vector3D { // This transformation matches three.js sphere implementation val y = r * cos(theta) val z = r * sin(theta) * sin(phi) val x = -r * sin(theta) * cos(phi) - return Point3D(x, y, z) + return Float32Vector3D(x, y, z) } val segments = detail ?: 32 diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index e9c9c146..58c3021d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -1,10 +1,5 @@ package space.kscience.visionforge.solid -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaProvider import space.kscience.dataforge.meta.float @@ -13,105 +8,48 @@ import space.kscience.visionforge.solid.Solid.Companion.X_KEY import space.kscience.visionforge.solid.Solid.Companion.Y_KEY import space.kscience.visionforge.solid.Solid.Companion.Z_KEY import kotlin.math.PI -import kotlin.math.pow -import kotlin.math.sqrt public const val PI2: Float = 2 * PI.toFloat() -@Serializable -public data class Point2D(public var x: Float, public var y: Float) - -public fun Point2D(x: Number, y: Number): Point2D = Point2D(x.toFloat(), y.toFloat()) - -public fun Point2D.toMeta(): Meta = Meta { +public fun Float32Vector2D.toMeta(): Meta = Meta { X_KEY put x Y_KEY put y } -internal fun Meta.point2D(): Point2D = Point2D(this["x"].float ?: 0f, this["y"].float ?: 0f) +internal fun Meta.toVector2D(): Float32Vector2D = + Float32Vector2D(this["x"].float ?: 0f, this["y"].float ?: 0f) -@Serializable(Point3DSerializer::class) -public interface Point3D { - public val x: Float - public val y: Float - public val z: Float +//@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") +//@Serializable(Point3DSerializer::class) +//public interface MutablePoint3D : Float32Vector3D { +// override var x: Float +// override var y: Float +// override var z: Float +//} +// +// +//public fun MutablePoint3D.normalizeInPlace() { +// val norm = sqrt(x.pow(2) + y.pow(2) + z.pow(2)) +// x /= norm +// y /= norm +// z /= norm +//} - public companion object { - public val ZERO: Point3D = Point3D(0.0, 0.0, 0.0) - public val ONE: Point3D = Point3D(1.0, 1.0, 1.0) - } -} - -@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") -@Serializable(Point3DSerializer::class) -public interface MutablePoint3D : Point3D { - override var x: Float - override var y: Float - override var z: Float -} - -@Serializable -private class Point3DImpl(override var x: Float, override var y: Float, override var z: Float) : MutablePoint3D - -internal object Point3DSerializer : KSerializer { - - override val descriptor: SerialDescriptor = Point3DImpl.serializer().descriptor - - override fun deserialize(decoder: Decoder): MutablePoint3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) - - override fun serialize(encoder: Encoder, value: Point3D) { - val impl: Point3DImpl = (value as? Point3DImpl) ?: Point3DImpl(value.x, value.y, value.z) - encoder.encodeSerializableValue(Point3DImpl.serializer(), impl) - } -} - -public fun Point3D(x: Number, y: Number, z: Number): Point3D = Point3DImpl(x.toFloat(), y.toFloat(), z.toFloat()) - -public operator fun Point3D.plus(other: Point3D): Point3D = Point3D( - this.x + other.x, - this.y + other.y, - this.z + other.z +internal fun MetaProvider.point3D(default: Float = 0f) = Float32Euclidean3DSpace.vector( + getMeta(X_KEY).float ?: default, + getMeta(Y_KEY).float ?: default, + getMeta(Z_KEY).float ?: default ) -public operator fun Point3D.minus(other: Point3D): Point3D = Point3D( - this.x - other.x, - this.y - other.y, - this.z - other.z -) -public operator fun Point3D.unaryMinus(): Point3D = Point3D( - -x, - -y, - -z -) - -public infix fun Point3D.cross(other: Point3D): Point3D = Point3D( - y * other.z - z * other.y, - z * other.x - x * other.z, - x * other.y - y * other.x -) - -public fun MutablePoint3D.normalizeInPlace() { - val norm = sqrt(x.pow(2) + y.pow(2) + z.pow(2)) - x /= norm - y /= norm - z /= norm -} - -internal fun MetaProvider.point3D(default: Float = 0f) = object : Point3D { - override val x: Float by float(default) - override val y: Float by float(default) - override val z: Float by float(default) -} - -public fun Point3D.toMeta(): Meta = Meta { +public fun Float32Vector3D.toMeta(): Meta = Meta { X_KEY put x Y_KEY put y Z_KEY put z } -internal fun Meta.toVector(default: Float = 0f) = Point3D( +internal fun Meta.toVector3D(default: Float = 0f) = Float32Vector3D( this[X_KEY].float ?: default, this[Y_KEY].float ?: default, this[Z_KEY].float ?: default diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt index 79274e62..8d838f6b 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt @@ -2,13 +2,10 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.getIndexed import space.kscience.dataforge.meta.toMeta -import space.kscience.dataforge.misc.DFExperimental import kotlin.test.Test import kotlin.test.assertEquals class ConvexTest { - @OptIn(DFExperimental::class) - @Suppress("UNUSED_VARIABLE") @Test fun testConvexBuilder() { val group = testSolids.solidGroup { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt index e75e4847..7a5f3c49 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt @@ -1,15 +1,14 @@ package space.kscience.visionforge.solid.three +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.solid.Float32Euclidean3DSpace +import space.kscience.visionforge.solid.Float32Vector3D +import space.kscience.visionforge.solid.GeometryBuilder import three.core.BufferGeometry import three.core.Float32BufferAttribute import three.math.Vector3 -import space.kscience.dataforge.meta.Meta -import space.kscience.visionforge.solid.GeometryBuilder -import space.kscience.visionforge.solid.Point3D -import space.kscience.visionforge.solid.cross -import space.kscience.visionforge.solid.minus -internal fun Point3D.toVector() = Vector3(x, y, z) +internal fun Float32Vector3D.toVector() = Vector3(x, y, z) internal fun MutableList.add(vararg values: T) { values.forEach { @@ -27,10 +26,10 @@ public class ThreeGeometryBuilder : GeometryBuilder { private val normals = ArrayList() // private val colors = ArrayList() - private val vertexCache = HashMap() + private val vertexCache = HashMap() private var counter: Short = -1 - private fun vertex(vertex: Point3D, normal: Point3D): Short = vertexCache.getOrPut(vertex) { + private fun vertex(vertex: Float32Vector3D, normal: Float32Vector3D): Short = vertexCache.getOrPut(vertex) { //add vertex and update cache if needed positions.add(vertex.x, vertex.y, vertex.z) normals.add(normal.x, vertex.y, vertex.z) @@ -39,8 +38,14 @@ public class ThreeGeometryBuilder : GeometryBuilder { counter } - override fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D?, meta: Meta) { - val actualNormal: Point3D = normal ?: ((vertex3 - vertex2) cross (vertex1 - vertex2)) + override fun face( + vertex1: Float32Vector3D, + vertex2: Float32Vector3D, + vertex3: Float32Vector3D, + normal: Float32Vector3D?, + meta: Meta, + ) = with(Float32Euclidean3DSpace) { + val actualNormal: Float32Vector3D = normal ?: ((vertex3 - vertex2) cross (vertex1 - vertex2)) indices.add( vertex(vertex1, actualNormal), vertex(vertex2, actualNormal), diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt index 99e7fba6..ef4eb39b 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt @@ -8,6 +8,7 @@ import kotlin.test.Test class TestServerExtensions { + @Suppress("UNUSED_VARIABLE") @Test fun testServerHeader(){ val string = createHTML().apply { -- 2.34.1 From 442fcb6c5b91def1cab21f91d99f27befc9a5470 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Jun 2023 18:29:04 +0300 Subject: [PATCH 124/143] Use KMath-geometry for solids --- .../kscience/visionforge/gdml/gdmlLoader.kt | 1 + .../space/kscience/visionforge/solid/Solid.kt | 42 ++++++++++++------- .../solid/transform/RemoveSingleChild.kt | 6 +-- .../visionforge/solid/three/ThreeFactory.kt | 10 ++--- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index e17248ad..230af4b0 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -6,6 +6,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.gdml.* +import space.kscience.kmath.geometry.RotationOrder import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.solid.* diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 8bd64336..e0140fe4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -8,6 +8,10 @@ import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus +import space.kscience.kmath.complex.Quaternion +import space.kscience.kmath.geometry.RotationOrder +import space.kscience.kmath.geometry.fromEuler +import space.kscience.kmath.geometry.radians import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY @@ -122,15 +126,6 @@ public var Solid.layer: Int // Common properties -public enum class RotationOrder { - XYZ, - YZX, - ZXY, - XZY, - YXZ, - ZYX -} - /** * Rotation order */ @@ -211,25 +206,42 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f) public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f) public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) -public var Solid.quaternion: Pair? +/** + * Raw quaternion value defined in properties + */ +public var Solid.quaternionValue: Quaternion? get() = properties.getValue(Solid.QUATERNION_KEY)?.list?.let { require(it.size == 4) { "Quaternion must be a number array of 4 elements" } - it[0].float to Float32Vector3D(it[1].float, it[2].float, it[3].float) + Quaternion(it[0].float, it[1].float, it[2].float, it[3].float) } set(value) { properties.setValue( Solid.QUATERNION_KEY, value?.let { ListValue( - value.first, - value.second.x, - value.second.y, - value.second.z + value.w, + value.x, + value.y, + value.z ) } ) } +/** + * Quaternion value including information from euler angles + */ +public var Solid.quaternion: Quaternion + get() = quaternionValue ?: Quaternion.fromEuler( + rotationX.radians, + rotationY.radians, + rotationZ.radians, + rotationOrder + ) + set(value) { + quaternionValue = value + } + //public var Solid.quaternion: Quaternion? // get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index 6a309d94..d2667e76 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.solid.transform import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName +import space.kscience.kmath.complex.QuaternionField import space.kscience.visionforge.root import space.kscience.visionforge.solid.* @@ -14,10 +15,7 @@ internal fun Solid.updateFrom(other: Solid): Solid { x += other.x y += other.y z += other.y - if(quaternion != null || other.quaternion != null) TODO("Quaternion support not implemented") - rotationX += other.rotationX - rotationY += other.rotationY - rotationZ += other.rotationZ + quaternion = with(QuaternionField) { other.quaternion * quaternion } scaleX *= other.scaleX scaleY *= other.scaleY scaleZ *= other.scaleZ diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index a0852c72..ec42a3c7 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -49,15 +49,15 @@ public fun Object3D.updatePosition(vision: Vision) { // } else { // setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) // } - val quaternion = vision.quaternion + val quaternion = vision.quaternionValue if (quaternion != null) { setRotationFromQuaternion( Quaternion( - quaternion.second.x, - quaternion.second.y, - quaternion.second.z, - quaternion.first + quaternion.x, + quaternion.y, + quaternion.z, + quaternion.w ) ) } else { -- 2.34.1 From 8204eb63c3fd03b96462c4ea6d8126b34e2b0ad3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Jun 2023 20:49:57 +0300 Subject: [PATCH 125/143] Make threeJS object generation suspend --- .../visionforge/solid/demo/VariableBox.kt | 2 +- .../solid/three/ThreeAmbientLightFactory.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 12 +++++++----- .../solid/three/ThreeCanvasLabelFactory.kt | 2 +- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../visionforge/solid/three/ThreeFactory.kt | 10 +--------- .../visionforge/solid/three/ThreeJsVision.kt | 17 +++++++++++++++-- .../solid/three/ThreeLabelFactory.kt | 2 +- .../visionforge/solid/three/ThreeLineFactory.kt | 10 +++++----- .../visionforge/solid/three/ThreeMeshFactory.kt | 2 +- .../solid/three/ThreeMeshLineFactory.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 3 +-- .../solid/three/ThreePointLightFactory.kt | 2 +- .../solid/three/ThreeReferenceFactory.kt | 2 +- .../solid/three/ThreeSmartLineFactory.kt | 2 +- .../kscience/visionforge/solid/three/three.kt | 4 ---- 16 files changed, 39 insertions(+), 37 deletions(-) diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 15e53129..701df81b 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -25,7 +25,7 @@ internal fun SolidGroup.varBox( internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision() { - override fun render(three: ThreePlugin): Object3D { + override suspend fun render(three: ThreePlugin): Object3D { val geometry = BoxGeometry(xSize, ySize, 1) val material = ThreeMaterials.DEFAULT.clone() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt index 3f8e251c..f15f2c78 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAmbientLightFactory.kt @@ -14,7 +14,7 @@ import kotlin.reflect.KClass public object ThreeAmbientLightFactory : ThreeFactory { override val type: KClass get() = AmbientLightSource::class - override fun build(three: ThreePlugin, vision: AmbientLightSource, observe: Boolean): AmbientLight { + override suspend fun build(three: ThreePlugin, vision: AmbientLightSource, observe: Boolean): AmbientLight { val res = AmbientLight().apply { color = vision.color.threeColor() ?: Color(0x404040) intensity = vision.intensity.toDouble() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 4e6935a8..6ecdad78 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.solid.three import kotlinx.browser.window +import kotlinx.coroutines.launch import org.w3c.dom.Element import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.Node @@ -264,11 +265,12 @@ public class ThreeCanvas( scene.findChild("@root".asName())?.let { scene.remove(it) } root?.dispose() } - - val object3D = three.buildObject3D(vision) - object3D.name = "@root" - scene.add(object3D) - root = object3D + three.context.launch { + val object3D = three.buildObject3D(vision) + object3D.name = "@root" + scene.add(object3D) + root = object3D + } } private var selected: Object3D? = null diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index b9f2a7d2..93bf170b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -22,7 +22,7 @@ import kotlin.reflect.KClass public object ThreeCanvasLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { val canvas = document.createElement("canvas") as HTMLCanvasElement canvas.width = 200 canvas.height = 200 diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index fe40022d..e6e9641c 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -38,7 +38,7 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class - override fun build(three: ThreePlugin, vision: Composite, observe: Boolean): Mesh { + override suspend fun build(three: ThreePlugin, vision: Composite, observe: Boolean): Mesh { val first = three.buildObject3D(vision.first, observe).takeIfMesh() ?: error("First part of composite is not a mesh") val second = three.buildObject3D(vision.second, observe).takeIfMesh() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index ec42a3c7..7c87a0f3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -26,7 +26,7 @@ public interface ThreeFactory { * Build an [Object3D] from [vision]. * @param observe if false, does not observe the changes in [vision] after render (useful for statics). */ - public fun build(three: ThreePlugin, vision: T, observe: Boolean = true): Object3D + public suspend fun build(three: ThreePlugin, vision: T, observe: Boolean = true): Object3D public companion object { public const val TYPE: String = "threeFactory" @@ -41,14 +41,6 @@ public fun Object3D.updatePosition(vision: Vision) { if (vision is Solid) { position.set(vision.x, vision.y, vision.z) -// val quaternion = obj.quaternion -// -// if (quaternion != null) { -// val (x, y, z, w) = quaternion -// setRotationFromQuaternion(Quaternion(x, y, z, w)) -// } else { -// setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) -// } val quaternion = vision.quaternionValue if (quaternion != null) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt index 3829698e..dcb328a1 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt @@ -1,11 +1,24 @@ package space.kscience.visionforge.solid.three -import three.core.Object3D +import org.w3c.dom.url.URL import space.kscience.visionforge.solid.SolidBase +import three.core.Object3D /** * A custom visual object that has its own Three.js renderer */ public abstract class ThreeJsVision : SolidBase() { - public abstract fun render(three: ThreePlugin): Object3D + public abstract suspend fun render(three: ThreePlugin): Object3D +} + +public class ThreeStlVision(val url: URL): ThreeJsVision(){ + override suspend fun render(three: ThreePlugin): Object3D { +// suspendCoroutine { +// +// } +// STLLoader() + + TODO() + } + } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index e168c1d2..45068a3a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -17,7 +17,7 @@ import kotlin.reflect.KClass public object ThreeLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class - override fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: SolidLabel, observe: Boolean): Object3D { val textGeo = TextBufferGeometry(vision.text, jso { font = vision.fontFamily size = 20 diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index adf4ce0d..45325430 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -1,22 +1,22 @@ package space.kscience.visionforge.solid.three -import three.core.BufferGeometry -import three.core.Object3D -import three.math.Color -import three.objects.LineSegments import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.color import space.kscience.visionforge.solid.string import space.kscience.visionforge.solid.three.ThreeMaterials.DEFAULT_LINE_COLOR +import three.core.BufferGeometry +import three.core.Object3D +import three.math.Color +import three.objects.LineSegments import kotlin.math.ceil import kotlin.reflect.KClass public object ThreeLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { val geometry = BufferGeometry().apply { setFromPoints(Array((vision.points.size - 1) * 2) { vision.points[ceil(it / 2.0).toInt()].toVector() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index 30f3034b..ab067326 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -26,7 +26,7 @@ public abstract class ThreeMeshFactory( */ public abstract fun buildGeometry(obj: T): BufferGeometry - override fun build(three: ThreePlugin, vision: T, observe: Boolean): Mesh { + override suspend fun build(three: ThreePlugin, vision: T, observe: Boolean): Mesh { val geometry = buildGeometry(vision) val mesh = Mesh(geometry, ThreeMaterials.DEFAULT).apply { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt index 3d9b4c3b..4a94823b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt @@ -15,7 +15,7 @@ import kotlin.reflect.KClass public object ThreeMeshLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { val geometry = MeshLine( Array((vision.points.size - 1) * 2) { vision.points[ceil(it / 2.0).toInt()].toVector() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 064597e6..17249648 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -6,7 +6,6 @@ import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.update import space.kscience.dataforge.names.* import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision @@ -47,7 +46,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { as ThreeFactory? } - public fun buildObject3D(vision: Solid, observe: Boolean = true): Object3D = when (vision) { + public suspend fun buildObject3D(vision: Solid, observe: Boolean = true): Object3D = when (vision) { is ThreeJsVision -> vision.render(this) is SolidReference -> ThreeReferenceFactory.build(this, vision, observe) is SolidGroup -> { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt index fdd2e019..b0a0bfeb 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePointLightFactory.kt @@ -13,7 +13,7 @@ public object ThreePointLightFactory : ThreeFactory { private val DEFAULT_COLOR = Color(0x404040) - override fun build(three: ThreePlugin, vision: PointLightSource, observe: Boolean): PointLight { + override suspend fun build(three: ThreePlugin, vision: PointLightSource, observe: Boolean): PointLight { val res = PointLight().apply { matrixAutoUpdate = false color = vision.color.threeColor() ?: DEFAULT_COLOR diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 405956f8..beb59df8 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -31,7 +31,7 @@ public object ThreeReferenceFactory : ThreeFactory { } } - override fun build(three: ThreePlugin, vision: SolidReference, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: SolidReference, observe: Boolean): Object3D { val template = vision.prototype val cachedObject = cache.getOrPut(template) { three.buildObject3D(template) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt index 2e7329da..6f2ee1a5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt @@ -7,7 +7,7 @@ import kotlin.reflect.KClass public object ThreeSmartLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { + override suspend fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { return if (vision.thickness == 1.0) { ThreeLineFactory.build(three, vision, observe) } else { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index 9c9d5b2b..f3fc0594 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -12,14 +12,10 @@ import three.math.Vector3 import three.objects.Mesh import three.textures.Texture import kotlin.contracts.contract -import kotlin.math.PI public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f) -internal fun Double.toRadians() = this * PI / 180 - - internal fun Any.dispose() { when (this) { is BufferGeometry -> dispose() -- 2.34.1 From 2b70afdb869a7f812762d133877fea9f65ea1a81 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 4 Jun 2023 20:58:03 +0300 Subject: [PATCH 126/143] Suspended renderers and property change listeners --- demo/js-playground/build.gradle.kts | 2 +- demo/solid-showcase/build.gradle.kts | 14 +++---- .../kscience/visionforge/solid/demo/demo.kt | 4 ++ .../space/kscience/visionforge/Vision.kt | 2 +- .../kscience/visionforge/solid/StlVision.kt | 25 ++++++++++++ .../solid/three/ThreeBoxFactory.kt | 2 +- .../solid/three/ThreeConeFactory.kt | 2 +- .../solid/three/ThreeConvexFactory.kt | 2 +- .../visionforge/solid/three/ThreeFactory.kt | 2 +- .../visionforge/solid/three/ThreeJsVision.kt | 13 ------- .../solid/three/ThreeMeshFactory.kt | 3 +- .../visionforge/solid/three/ThreePlugin.kt | 1 + .../solid/three/ThreeSphereFactory.kt | 2 +- .../solid/three/ThreeStlFactory.kt | 38 +++++++++++++++++++ .../three/external/loaders/STLLoader.kt | 13 +++++-- 15 files changed, 93 insertions(+), 32 deletions(-) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/StlVision.kt create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index 603b921a..94835588 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -8,7 +8,7 @@ kscience{ kotlin{ explicitApi = null - js(IR){ + js{ useCommonJs() browser { binaries.executable() diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index 8f1c370b..05a02260 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -1,14 +1,14 @@ plugins { id("space.kscience.gradle.mpp") - application +// application } kscience { useCoroutines() - jvm { - withJava() + jvm() + js{ + binaries.executable() } - js() dependencies { implementation(projects.visionforgeSolid) implementation(projects.visionforgeGdml) @@ -21,6 +21,6 @@ kscience { kotlin.explicitApi = null -application { - mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") -} \ No newline at end of file +//application { +// mainClass.set("space.kscience.visionforge.solid.demo.FXDemoAppKt") +//} \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 5fdec43b..6f2cb61f 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -150,6 +150,10 @@ fun VisionLayout.showcase() { z = 26 } } + + demo("STL", "STL loaded from URL"){ + stl("https://ozeki.hu/attachments/116/Menger_sponge_sample.stl") + } } fun VisionLayout.showcaseCSG() { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index aa698409..ce5f588f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -67,7 +67,7 @@ public var Vision.visible: Boolean? */ public fun Vision.onPropertyChange( scope: CoroutineScope? = manager?.context, - callback: (Name) -> Unit + callback: suspend (Name) -> Unit ): Job = properties.changes.onEach { callback(it) }.launchIn(scope ?: error("Orphan Vision can't observe properties")) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/StlVision.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/StlVision.kt new file mode 100644 index 00000000..8c975c47 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/StlVision.kt @@ -0,0 +1,25 @@ +package space.kscience.visionforge.solid + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.setChild + + +public sealed class StlVision: SolidBase() + +@Serializable +@SerialName("solid.stl.url") +public class StlUrlVision(public val url: String) : StlVision() + +@Serializable +@SerialName("solid.stl.binary") +public class StlBinaryVision(public val data: ByteArray) : StlVision() + +@VisionBuilder +public inline fun MutableVisionContainer.stl( + url: String, + name: String? = null, + action: StlVision.() -> Unit = {}, +): StlVision = StlUrlVision(url).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt index 21c52198..d6840f75 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeBoxFactory.kt @@ -5,7 +5,7 @@ import space.kscience.visionforge.solid.detail import three.geometries.BoxGeometry public object ThreeBoxFactory : ThreeMeshFactory(Box::class) { - override fun buildGeometry(obj: Box): BoxGeometry = + override suspend fun buildGeometry(obj: Box): BoxGeometry = obj.detail?.let { detail -> BoxGeometry(obj.xSize, obj.ySize, obj.zSize, detail, detail, detail) } ?: BoxGeometry(obj.xSize, obj.ySize, obj.zSize) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt index 6b2db845..bcc147c7 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConeFactory.kt @@ -8,7 +8,7 @@ import kotlin.math.PI import kotlin.math.pow public object ThreeConeFactory : ThreeMeshFactory(ConeSegment::class) { - override fun buildGeometry(obj: ConeSegment): BufferGeometry { + override suspend fun buildGeometry(obj: ConeSegment): BufferGeometry { val cylinder = obj.detail?.let { val segments = it.toDouble().pow(0.5).toInt() CylinderGeometry( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt index 83115b13..b772c1bf 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeConvexFactory.kt @@ -4,7 +4,7 @@ import space.kscience.visionforge.solid.Convex import three.external.geometries.ConvexBufferGeometry public object ThreeConvexFactory : ThreeMeshFactory(Convex::class) { - override fun buildGeometry(obj: Convex): ConvexBufferGeometry { + override suspend fun buildGeometry(obj: Convex): ConvexBufferGeometry { val vectors = obj.points.map { it.toVector() }.toTypedArray() return ConvexBufferGeometry(vectors) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 7c87a0f3..dcf94717 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -84,7 +84,7 @@ public fun Object3D.updateProperty(source: Vision, propertyName: Name) { * Generic factory for elements which provide inside geometry builder */ public object ThreeShapeFactory : ThreeMeshFactory(GeometrySolid::class) { - override fun buildGeometry(obj: GeometrySolid): BufferGeometry = ThreeGeometryBuilder().apply { + override suspend fun buildGeometry(obj: GeometrySolid): BufferGeometry = ThreeGeometryBuilder().apply { obj.toGeometry(this) }.build() } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt index dcb328a1..6f6e166a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeJsVision.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.solid.three -import org.w3c.dom.url.URL import space.kscience.visionforge.solid.SolidBase import three.core.Object3D @@ -10,15 +9,3 @@ import three.core.Object3D public abstract class ThreeJsVision : SolidBase() { public abstract suspend fun render(three: ThreePlugin): Object3D } - -public class ThreeStlVision(val url: URL): ThreeJsVision(){ - override suspend fun render(three: ThreePlugin): Object3D { -// suspendCoroutine { -// -// } -// STLLoader() - - TODO() - } - -} diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index ab067326..06224bbb 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -21,10 +21,11 @@ import kotlin.reflect.KClass public abstract class ThreeMeshFactory( override val type: KClass, ) : ThreeFactory { + /** * Build a geometry for an object */ - public abstract fun buildGeometry(obj: T): BufferGeometry + public abstract suspend fun buildGeometry(obj: T): BufferGeometry override suspend fun build(three: ThreePlugin, vision: T, observe: Boolean): Mesh { val geometry = buildGeometry(vision) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 17249648..e2af8c30 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -37,6 +37,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory objectFactories[PointLightSource::class] = ThreePointLightFactory + objectFactories[StlVision::class] = ThreeStlFactory } @Suppress("UNCHECKED_CAST") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt index d738c073..9753f9ad 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSphereFactory.kt @@ -6,7 +6,7 @@ import three.core.BufferGeometry import three.geometries.SphereGeometry public object ThreeSphereFactory : ThreeMeshFactory(Sphere::class) { - override fun buildGeometry(obj: Sphere): BufferGeometry { + override suspend fun buildGeometry(obj: Sphere): BufferGeometry { return obj.detail?.let { detail -> SphereGeometry( radius = obj.radius, diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt new file mode 100644 index 00000000..d21389aa --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt @@ -0,0 +1,38 @@ +package space.kscience.visionforge.solid.three + +import org.khronos.webgl.ArrayBuffer +import org.khronos.webgl.Int8Array +import space.kscience.visionforge.solid.StlBinaryVision +import space.kscience.visionforge.solid.StlUrlVision +import space.kscience.visionforge.solid.StlVision +import three.core.BufferGeometry +import three.external.loaders.STLLoader +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +fun ArrayBuffer.toByteArray(): ByteArray = Int8Array(this).unsafeCast() + +public object ThreeStlFactory : ThreeMeshFactory(StlVision::class) { + + private val loader = STLLoader().apply { + requestHeader = listOf("Access-Control-Allow-Origin: *") + } + + override suspend fun buildGeometry(obj: StlVision): BufferGeometry = when (obj) { + is StlBinaryVision -> loader.parse(obj.data) + is StlUrlVision -> suspendCoroutine { continuation -> + loader.load( + url = obj.url, + onLoad = { + continuation.resume(it) + }, + onError = { + continuation.resumeWithException(RuntimeException("Failed to load STL object from ${obj.url}")) + } + ) + } + } + + +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt b/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt index 5fa253ab..e3e6133f 100644 --- a/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt +++ b/visionforge-threejs/src/main/kotlin/three/external/loaders/STLLoader.kt @@ -22,17 +22,19 @@ * THE SOFTWARE. */ -@file:JsModule("three") +@file:JsModule("three/examples/jsm/loaders/STLLoader.js") @file:JsNonModule package three.external.loaders +import org.khronos.webgl.ArrayBuffer import org.w3c.xhr.XMLHttpRequest import three.core.BufferGeometry -import three.core.Object3D external class STLLoader { + var requestHeader: List + fun load( url: String, onLoad: (BufferGeometry) -> Unit, @@ -40,7 +42,10 @@ external class STLLoader { onError: () -> Unit = definedExternally ) - fun parse(data: String): Object3D - fun parse(data: ByteArray): Object3D + fun parse(data: String): BufferGeometry + + fun parse(data: ByteArray): BufferGeometry + + fun parse(data: ArrayBuffer): BufferGeometry } \ No newline at end of file -- 2.34.1 From 20851baaf521a9de883ae89deefad27c62854d5a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 6 Jun 2023 18:43:18 +0300 Subject: [PATCH 127/143] Make Axes a separate object --- demo/playground/src/jvmMain/kotlin/axes.kt | 22 ++++++++++++++++ .../kscience/visionforge/solid/MiscSolid.kt | 26 +++++++++++++++++++ .../space/kscience/visionforge/solid/Solid.kt | 21 +++++++-------- .../kscience/visionforge/solid/Solids.kt | 2 ++ .../solid/{StlVision.kt => StlSolid.kt} | 10 +++---- .../solid/specifications/AxesScheme.kt | 2 ++ .../solid/specifications/Canvas3DOptions.kt | 2 ++ .../solid/three/ThreeAxesFactory.kt | 22 ++++++++++++++++ .../visionforge/solid/three/ThreeCanvas.kt | 17 +++--------- .../visionforge/solid/three/ThreeFactory.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 3 ++- .../solid/three/ThreeSmartLineFactory.kt | 14 +++++----- .../solid/three/ThreeStlFactory.kt | 14 +++++----- 13 files changed, 112 insertions(+), 45 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/axes.kt create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/MiscSolid.kt rename visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/{StlVision.kt => StlSolid.kt} (61%) create mode 100644 visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAxesFactory.kt diff --git a/demo/playground/src/jvmMain/kotlin/axes.kt b/demo/playground/src/jvmMain/kotlin/axes.kt new file mode 100644 index 00000000..b8178887 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/axes.kt @@ -0,0 +1,22 @@ +package space.kscience.visionforge.examples + +import space.kscience.kmath.geometry.Euclidean3DSpace +import space.kscience.kmath.geometry.radians +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import kotlin.math.PI + +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision("canvas") { + requirePlugin(Solids) + solid { + axes(100, "root-axes") + solidGroup("group") { + z = 100 + rotate((PI / 4).radians, Euclidean3DSpace.vector(1, 1, 1)) + axes(100, "local-axes") + box(50, 50, 50, "box") + } + } + } +} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/MiscSolid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/MiscSolid.kt new file mode 100644 index 00000000..f83f6cb9 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/MiscSolid.kt @@ -0,0 +1,26 @@ +package space.kscience.visionforge.solid + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.visionforge.MutableVisionContainer +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.setChild + +public abstract class MiscSolid: SolidBase() + +@Serializable +@SerialName("solid.axes") +public class AxesSolid(public val size: Double): MiscSolid(){ + public companion object{ + public const val AXES_NAME: String = "@xes" + } +} + +@VisionBuilder +public fun MutableVisionContainer.axes( + size: Number, + name: String = "@axes", + block: AxesSolid.() -> Unit = {}, +): AxesSolid = AxesSolid(size.toDouble()).apply(block).also { + setChild(name, it) +} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index e0140fe4..cb0c90f0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -9,9 +9,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.kmath.complex.Quaternion -import space.kscience.kmath.geometry.RotationOrder -import space.kscience.kmath.geometry.fromEuler -import space.kscience.kmath.geometry.radians +import space.kscience.kmath.geometry.* import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY @@ -242,14 +240,13 @@ public var Solid.quaternion: Quaternion quaternionValue = value } - -//public var Solid.quaternion: Quaternion? -// get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) } -// set(value) { -// meta[Solid::quaternion.name] = value?.values?.asValue() -// } - - public var Solid.scaleX: Number by float(X_SCALE_KEY, 1f) public var Solid.scaleY: Number by float(Y_SCALE_KEY, 1f) -public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) \ No newline at end of file +public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) + +/** + * Add rotation with given [angle] relative to given [axis] + */ +public fun Solid.rotate(angle: Angle, axis: DoubleVector3D) { + quaternion = Quaternion.fromRotation(angle, axis) +} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index ab9fde1e..e9301f67 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -48,6 +48,8 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer() +public sealed class StlSolid: SolidBase() @Serializable @SerialName("solid.stl.url") -public class StlUrlVision(public val url: String) : StlVision() +public class StlUrlSolid(public val url: String) : StlSolid() @Serializable @SerialName("solid.stl.binary") -public class StlBinaryVision(public val data: ByteArray) : StlVision() +public class StlBinarySolid(public val data: ByteArray) : StlSolid() @VisionBuilder public inline fun MutableVisionContainer.stl( url: String, name: String? = null, - action: StlVision.() -> Unit = {}, -): StlVision = StlUrlVision(url).apply(action).also { setChild(name, it) } \ No newline at end of file + action: StlSolid.() -> Unit = {}, +): StlSolid = StlUrlSolid(url).apply(action).also { setChild(name, it) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt index d4eb8e2b..0ed9126e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt @@ -7,11 +7,13 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.double +@Deprecated("Use separate axes object instead") public class AxesScheme : Scheme() { public var visible: Boolean by boolean(false) public var size: Double by double(AXIS_SIZE) public var width: Double by double(AXIS_WIDTH) + @Suppress("DEPRECATION") public companion object : SchemeSpec(::AxesScheme) { public const val AXIS_SIZE: Double = 1000.0 public const val AXIS_WIDTH: Double = 3.0 diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 78e35dfa..b24c9b75 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -59,6 +59,7 @@ public class CanvasSize : Scheme() { } public class Canvas3DOptions : Scheme() { + @Suppress("DEPRECATION") public var axes: AxesScheme by spec(AxesScheme) public var camera: CameraScheme by spec(CameraScheme) public var controls: ControlsScheme by spec(ControlsScheme) @@ -75,6 +76,7 @@ public class Canvas3DOptions : Scheme() { public companion object : SchemeSpec(::Canvas3DOptions) { override val descriptor: MetaDescriptor by lazy { MetaDescriptor { + @Suppress("DEPRECATION") scheme(Canvas3DOptions::axes, AxesScheme) value(Canvas3DOptions::layers) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAxesFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAxesFactory.kt new file mode 100644 index 00000000..8af445b9 --- /dev/null +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeAxesFactory.kt @@ -0,0 +1,22 @@ +package space.kscience.visionforge.solid.three + +import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.solid.AxesSolid +import three.helpers.AxesHelper +import kotlin.reflect.KClass + +public object ThreeAxesFactory : ThreeFactory { + override val type: KClass get() = AxesSolid::class + + override suspend fun build(three: ThreePlugin, vision: AxesSolid, observe: Boolean): AxesHelper { + val res = AxesHelper(vision.size.toInt()) + + if (observe) { + vision.onPropertyChange(three.context) { propertyName -> + res.updateProperty(vision, propertyName) + } + } + + return res + } +} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 6ecdad78..c692b88d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -57,16 +57,6 @@ public class ThreeCanvas( axesObject.name = AXES_NAME add(axesObject) } - -// //Set up light -// options.useProperty(Canvas3DOptions::light, this) { lightConfig -> -// //remove old light if present -// getObjectByName(LIGHT_NAME)?.let { remove(it) } -// //add new light -// val lightObject = buildLight(lightConfig) -// lightObject.name = LIGHT_NAME -// add(lightObject) -// } } @@ -110,7 +100,7 @@ public class ThreeCanvas( } /** - * Force camera aspect ration and renderer size recalculation + * Force camera aspect ratio and renderer size recalculation */ private fun updateSize() { val width = element.clientWidth @@ -202,7 +192,7 @@ public class ThreeCanvas( } /** - * Resolve full name of the object relative to the global root + * Resolve the full name of the object relative to the global root */ private fun Object3D.fullName(): Name { if (root == null) error("Can't resolve element name without the root") @@ -213,7 +203,7 @@ public class ThreeCanvas( } } - //find first non-static parent in this object ancestry + //find the first non-static parent in this object ancestry private tailrec fun Object3D.upTrace(): Object3D? = if (!name.startsWith("@")) this else parent?.upTrace() private fun pick(): Object3D? { @@ -267,6 +257,7 @@ public class ThreeCanvas( } three.context.launch { val object3D = three.buildObject3D(vision) + object3D.name = "@root" scene.add(object3D) root = object3D diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index dcf94717..46e3d41b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -37,7 +37,7 @@ public interface ThreeFactory { * Update position, rotation and visibility */ public fun Object3D.updatePosition(vision: Vision) { - visible = vision.visible ?: true +// visible = vision.visible ?: true if (vision is Solid) { position.set(vision.x, vision.y, vision.z) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index e2af8c30..c1c2cf4d 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -37,7 +37,8 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory objectFactories[PointLightSource::class] = ThreePointLightFactory - objectFactories[StlVision::class] = ThreeStlFactory + objectFactories[StlSolid::class] = ThreeStlFactory + objectFactories[AxesSolid::class] = ThreeAxesFactory } @Suppress("UNCHECKED_CAST") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt index 6f2ee1a5..b3609b66 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt @@ -7,11 +7,13 @@ import kotlin.reflect.KClass public object ThreeSmartLineFactory : ThreeFactory { override val type: KClass get() = PolyLine::class - override suspend fun build(three: ThreePlugin, vision: PolyLine, observe: Boolean): Object3D { - return if (vision.thickness == 1.0) { - ThreeLineFactory.build(three, vision, observe) - } else { - ThreeMeshLineFactory.build(three, vision, observe) - } + override suspend fun build( + three: ThreePlugin, + vision: PolyLine, + observe: Boolean, + ): Object3D = if (vision.thickness == 1.0) { + ThreeLineFactory.build(three, vision, observe) + } else { + ThreeMeshLineFactory.build(three, vision, observe) } } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt index d21389aa..e3fb676f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt @@ -2,9 +2,9 @@ package space.kscience.visionforge.solid.three import org.khronos.webgl.ArrayBuffer import org.khronos.webgl.Int8Array -import space.kscience.visionforge.solid.StlBinaryVision -import space.kscience.visionforge.solid.StlUrlVision -import space.kscience.visionforge.solid.StlVision +import space.kscience.visionforge.solid.StlBinarySolid +import space.kscience.visionforge.solid.StlSolid +import space.kscience.visionforge.solid.StlUrlSolid import three.core.BufferGeometry import three.external.loaders.STLLoader import kotlin.coroutines.resume @@ -13,15 +13,15 @@ import kotlin.coroutines.suspendCoroutine fun ArrayBuffer.toByteArray(): ByteArray = Int8Array(this).unsafeCast() -public object ThreeStlFactory : ThreeMeshFactory(StlVision::class) { +public object ThreeStlFactory : ThreeMeshFactory(StlSolid::class) { private val loader = STLLoader().apply { requestHeader = listOf("Access-Control-Allow-Origin: *") } - override suspend fun buildGeometry(obj: StlVision): BufferGeometry = when (obj) { - is StlBinaryVision -> loader.parse(obj.data) - is StlUrlVision -> suspendCoroutine { continuation -> + override suspend fun buildGeometry(obj: StlSolid): BufferGeometry = when (obj) { + is StlBinarySolid -> loader.parse(obj.data) + is StlUrlSolid -> suspendCoroutine { continuation -> loader.load( url = obj.url, onLoad = { -- 2.34.1 From 4bce9ad34cbeff8c4caa219ffcf892d737059b6d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 7 Jun 2023 17:44:52 +0300 Subject: [PATCH 128/143] update version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 30eea98f..8997eeda 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-9" + version = "0.3.0-dev-10" } subprojects { -- 2.34.1 From 07b54fde51391c4e68a520f101143e0553521e90 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 7 Jun 2023 19:43:15 +0300 Subject: [PATCH 129/143] Use quaternion as rotation value --- .../kotlin/space/kscience/visionforge/solid/Solid.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index cb0c90f0..a24192a8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -60,8 +60,6 @@ public interface Solid : Vision { public val ROTATION_KEY: Name = "rotation".asName() - public val QUATERNION_KEY: Name = "quaternion".asName() - public val X_ROTATION_KEY: Name = ROTATION_KEY + X_KEY public val Y_ROTATION_KEY: Name = ROTATION_KEY + Y_KEY public val Z_ROTATION_KEY: Name = ROTATION_KEY + Z_KEY @@ -208,13 +206,13 @@ public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) * Raw quaternion value defined in properties */ public var Solid.quaternionValue: Quaternion? - get() = properties.getValue(Solid.QUATERNION_KEY)?.list?.let { + get() = properties.getValue(ROTATION_KEY)?.list?.let { require(it.size == 4) { "Quaternion must be a number array of 4 elements" } Quaternion(it[0].float, it[1].float, it[2].float, it[3].float) } set(value) { properties.setValue( - Solid.QUATERNION_KEY, + ROTATION_KEY, value?.let { ListValue( value.w, -- 2.34.1 From f2d7e20fd3258830aa84d7b19e75b399c6fd3ad9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 7 Jun 2023 21:29:40 +0300 Subject: [PATCH 130/143] Add dynamic rotation example --- .../space/kscience/visionforge/solid/demo/demo.kt | 13 +++++++++++-- .../space/kscience/visionforge/solid/Solid.kt | 5 +++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 6f2cb61f..baee4c71 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -4,6 +4,8 @@ import kotlinx.coroutines.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name +import space.kscience.kmath.geometry.Euclidean3DSpace +import space.kscience.kmath.geometry.radians import space.kscience.visionforge.Colors import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions @@ -103,8 +105,15 @@ fun VisionLayout.showcase() { solidGroup { x = 200 rotationY = PI / 4 + axes(200) box(100, 100, 100) { - rotationZ = PI / 4 + rotate((PI / 4).radians, Euclidean3DSpace.zAxis) + GlobalScope.launch(Dispatchers.Main) { + while (isActive) { + delay(100) + rotate((PI/20).radians,Euclidean3DSpace.yAxis) + } + } color.set(Colors.red) } } @@ -151,7 +160,7 @@ fun VisionLayout.showcase() { } } - demo("STL", "STL loaded from URL"){ + demo("STL", "STL loaded from URL") { stl("https://ozeki.hu/attachments/116/Menger_sponge_sample.stl") } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index a24192a8..c58b849d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -9,6 +9,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.kmath.complex.Quaternion +import space.kscience.kmath.complex.QuaternionField import space.kscience.kmath.geometry.* import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY @@ -245,6 +246,6 @@ public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) /** * Add rotation with given [angle] relative to given [axis] */ -public fun Solid.rotate(angle: Angle, axis: DoubleVector3D) { - quaternion = Quaternion.fromRotation(angle, axis) +public fun Solid.rotate(angle: Angle, axis: DoubleVector3D) = with(QuaternionField) { + quaternion = Quaternion.fromRotation(angle, axis)*quaternion } \ No newline at end of file -- 2.34.1 From 8611327cc4bc8711e5e6dd6723b20ee7f53398e3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 8 Jun 2023 10:04:31 +0300 Subject: [PATCH 131/143] antenna example --- demo/playground/src/jvmMain/kotlin/antenna.kt | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 demo/playground/src/jvmMain/kotlin/antenna.kt diff --git a/demo/playground/src/jvmMain/kotlin/antenna.kt b/demo/playground/src/jvmMain/kotlin/antenna.kt new file mode 100644 index 00000000..5b92f46f --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/antenna.kt @@ -0,0 +1,43 @@ +package space.kscience.visionforge.examples + +import space.kscience.kmath.complex.Quaternion +import space.kscience.kmath.geometry.RotationOrder +import space.kscience.kmath.geometry.degrees +import space.kscience.kmath.geometry.fromEuler +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import kotlin.math.PI + +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + + val direction = Quaternion.fromEuler( 45.degrees, 45.degrees, 0.degrees, RotationOrder.XYZ) + + vision("canvas") { + requirePlugin(Solids) + solid { + rotationX = -PI / 2 + rotationZ = PI + axes(200) + ambientLight() + cylinder(50, 5, name = "base") + solidGroup("frame") { + rotationY = PI/2 + rotationX = -PI/2 + rotationZ = -PI/2 + z = 60 + axes(200) + solidGroup("antenna") { + tube(40, 10, 30) + sphereLayer(100, 95, theta = PI / 6) { + z = 100 + rotationX = -PI / 2 + } + cylinder(5, 30) { + z = 15 + } + this.quaternion = direction + } + } + } + } +} \ No newline at end of file -- 2.34.1 From 04b4a129461f54476530c4b5d8ffb20a2495b49c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 22 Jun 2023 08:32:52 +0300 Subject: [PATCH 132/143] antenna example --- demo/playground/src/jvmMain/kotlin/antenna.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/antenna.kt b/demo/playground/src/jvmMain/kotlin/antenna.kt index 5b92f46f..cd711d11 100644 --- a/demo/playground/src/jvmMain/kotlin/antenna.kt +++ b/demo/playground/src/jvmMain/kotlin/antenna.kt @@ -1,16 +1,27 @@ package space.kscience.visionforge.examples import space.kscience.kmath.complex.Quaternion -import space.kscience.kmath.geometry.RotationOrder +import space.kscience.kmath.complex.QuaternionField +import space.kscience.kmath.geometry.Angle +import space.kscience.kmath.geometry.Euclidean3DSpace import space.kscience.kmath.geometry.degrees -import space.kscience.kmath.geometry.fromEuler +import space.kscience.kmath.geometry.fromRotation import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.* import kotlin.math.PI fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { - val direction = Quaternion.fromEuler( 45.degrees, 45.degrees, 0.degrees, RotationOrder.XYZ) + val azimuth = 60.degrees + val inclination = 15.degrees + + val direction = with(QuaternionField) { + Quaternion.fromRotation(-azimuth, Euclidean3DSpace.zAxis) * + Quaternion.fromRotation(Angle.piDiv2 - inclination, Euclidean3DSpace.yAxis) + } + + //val direction2 = Quaternion.fromEuler(Angle.zero, Angle.piDiv2 - inclination, -azimuth, RotationOrder.ZYX) + vision("canvas") { requirePlugin(Solids) @@ -21,9 +32,6 @@ fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { ambientLight() cylinder(50, 5, name = "base") solidGroup("frame") { - rotationY = PI/2 - rotationX = -PI/2 - rotationZ = -PI/2 z = 60 axes(200) solidGroup("antenna") { @@ -35,7 +43,7 @@ fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { cylinder(5, 30) { z = 15 } - this.quaternion = direction + quaternion = direction } } } -- 2.34.1 From 8b25761dc6a37cd51413641e8374c85707497c53 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 19 Jul 2023 22:25:32 +0300 Subject: [PATCH 133/143] Refactor jupyter integratin --- build.gradle.kts | 2 +- demo/playground/build.gradle.kts | 5 +- demo/playground/notebooks/common-demo.ipynb | 104 ++++++++++++++++++ demo/playground/notebooks/dynamic-demo.ipynb | 50 +-------- .../src/jsMain/kotlin/playgroundMain.kt | 4 +- demo/sat-demo/build.gradle.kts | 6 +- jupyter/visionforge-jupyter-gdml/README.md | 32 ------ .../src/jsMain/kotlin/gdmlJupyter.kt | 12 -- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 38 ------- .../webpack.config.d/01.ring.js | 3 - settings.gradle.kts | 4 +- .../kscience/visionforge/html/VisionPage.kt | 2 +- {jupyter => visionforge-jupyter}/README.md | 0 .../build.gradle.kts | 2 + .../src/jsMain/kotlin/VFNotebookClient.kt | 6 +- .../src/jvmMain/kotlin/VisionForge.kt | 22 ++-- .../jvmMain/kotlin/VisionForgeIntegration.kt | 19 +++- .../src/jvmMain/kotlin/forms.kt | 11 +- .../build.gradle.kts | 22 ++-- .../src/jsMain/kotlin/commonJupyter.kt | 17 +++ .../kotlin/JupyterCommonIntegration.kt | 40 ++++--- .../webpack.config.d/01.ring.js | 24 ++++ visionforge-server/build.gradle.kts | 2 +- .../visionforge/server/VisionServer.kt | 1 - .../space/kscience/visionforge/solid/Solid.kt | 2 +- .../kscience/visionforge/solid/SolidGroup.kt | 5 + visionforge-tables/build.gradle.kts | 14 +-- .../visionforge/tables/VisionOfTable.kt | 5 + 28 files changed, 264 insertions(+), 190 deletions(-) create mode 100644 demo/playground/notebooks/common-demo.ipynb delete mode 100644 jupyter/visionforge-jupyter-gdml/README.md delete mode 100644 jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt delete mode 100644 jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt delete mode 100644 jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js rename {jupyter => visionforge-jupyter}/README.md (100%) rename {jupyter => visionforge-jupyter}/build.gradle.kts (86%) rename jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt => visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt (90%) rename jupyter/src/jvmMain/kotlin/VFForNotebook.kt => visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt (88%) rename jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt => visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt (85%) rename {jupyter => visionforge-jupyter}/src/jvmMain/kotlin/forms.kt (82%) rename {jupyter/visionforge-jupyter-gdml => visionforge-jupyter/visionforge-jupyter-common}/build.gradle.kts (53%) create mode 100644 visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt rename demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt => visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt (51%) create mode 100644 visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js diff --git a/build.gradle.kts b/build.gradle.kts index 8997eeda..73f03bbd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-10" + version = "0.3.0-dev-11" } subprojects { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index ddc1d6a8..77dd565e 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -47,12 +47,11 @@ kotlin { val commonMain by getting { dependencies { implementation(projects.visionforgeSolid) - implementation(projects.visionforgeGdml) implementation(projects.visionforgePlotly) implementation(projects.visionforgeMarkdown) implementation(projects.visionforgeTables) implementation(projects.cernRootLoader) - implementation(projects.jupyter) + implementation(projects.visionforgeJupyter.visionforgeJupyterCommon) } } @@ -66,6 +65,8 @@ kotlin { val jvmMain by getting { dependencies { + implementation("io.ktor:ktor-server-cio:${spclibs.versions.ktor.get()}") + implementation(projects.visionforgeGdml) implementation(projects.visionforgeServer) implementation(spclibs.logback.classic) implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb new file mode 100644 index 00000000..73409ae7 --- /dev/null +++ b/demo/playground/notebooks/common-demo.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "@file:Repository(\"*mavenLocal\")\n", + "@file:Repository(\"https://repo.kotlin.link\")\n", + "@file:Repository(\"https://maven.pkg.jetbrains.space/spc/p/sci/dev\")\n", + "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + ":classpath" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "vf.startServer()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "import space.kscience.visionforge.plotly.plotly\n", + "\n", + "vf.page {\n", + " h1 { +\"AAA\" }\n", + " vision {\n", + " solid {\n", + " ambientLight()\n", + " box(100, 100, 200)\n", + "\n", + " sphere(100) {\n", + " x = 300\n", + " }\n", + " }\n", + " }\n", + "\n", + " vision {\n", + " plotly {\n", + " scatter {\n", + " x(1, 2, 3, 1)\n", + " y(1, 2, 3, 4)\n", + " }\n", + " }\n", + " }\n", + "}" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "name": "kotlin", + "version": "1.8.20", + "mimetype": "text/x-kotlin", + "file_extension": ".kt", + "pygments_lexer": "kotlin", + "codemirror_mode": "text/x-kotlin", + "nbconvert_exporter": "" + }, + "ktnbPluginMetadata": { + "isAddProjectLibrariesToClasspath": false + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/playground/notebooks/dynamic-demo.ipynb b/demo/playground/notebooks/dynamic-demo.ipynb index 41289185..ac70b4c2 100644 --- a/demo/playground/notebooks/dynamic-demo.ipynb +++ b/demo/playground/notebooks/dynamic-demo.ipynb @@ -2,15 +2,11 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "tags": [], "pycharm": { "is_executing": true - }, - "ExecuteTime": { - "end_time": "2023-05-29T15:22:37.933397300Z", - "start_time": "2023-05-29T15:22:37.913872100Z" } }, "outputs": [], @@ -18,57 +14,23 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2023-05-29T15:22:50.486483300Z", - "start_time": "2023-05-29T15:22:50.457485500Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Line_2.jupyter.kts (1:1 - 3) Unresolved reference: vf" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "vf.startServer()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false - }, - "ExecuteTime": { - "end_time": "2023-05-29T15:22:51.410680600Z", - "start_time": "2023-05-29T15:22:51.250779400Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Line_3.jupyter.kts (1:16 - 26) Unresolved reference: coroutines\n", - "Line_3.jupyter.kts (4:1 - 7) Unresolved reference: Plotly\n", - "Line_3.jupyter.kts (5:5 - 12) Unresolved reference: scatter\n", - "Line_3.jupyter.kts (6:9 - 10) Unresolved reference: x\n", - "Line_3.jupyter.kts (7:9 - 10) Unresolved reference: y\n", - "Line_3.jupyter.kts (8:12 - 14) Unresolved reference: vf\n", - "Line_3.jupyter.kts (9:13 - 15) Unresolved reference: vf\n", - "Line_3.jupyter.kts (10:23 - 31) Unresolved reference: isActive\n", - "Line_3.jupyter.kts (11:21 - 26) Unresolved reference: delay\n", - "Line_3.jupyter.kts (12:21 - 22) Unresolved reference: y" - ] - } - ], + "outputs": [], "source": [ "import kotlinx.coroutines.*\n", "import kotlin.random.Random\n", diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 8e259d48..feff4de1 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -1,5 +1,5 @@ import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.jupyter.VFNotebookPlugin +import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin @@ -12,5 +12,5 @@ fun main() = runVisionClient { plugin(PlotlyPlugin) plugin(MarkupPlugin) plugin(TableVisionJsPlugin) - plugin(VFNotebookPlugin) + plugin(VFNotebookClient) } \ No newline at end of file diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 6afadf27..5e881b63 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -8,13 +8,15 @@ kscience { // useSerialization { // json() // } + useKtor() dependencies{ + implementation("io.ktor:ktor-server-cio") implementation(projects.visionforgeThreejs.visionforgeThreejsServer) - implementation("ch.qos.logback:logback-classic:1.4.5") + implementation(spclibs.logback.classic) } } -group = "ru.mipt.npm" +group = "center.sciprog" application { mainClass.set("ru.mipt.npm.sat.SatServerKt") diff --git a/jupyter/visionforge-jupyter-gdml/README.md b/jupyter/visionforge-jupyter-gdml/README.md deleted file mode 100644 index cae8af86..00000000 --- a/jupyter/visionforge-jupyter-gdml/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Module visionforge-jupyter-gdml - -Jupyter api artifact for GDML rendering - -## Usage - -## Artifact: - -The Maven coordinates of this project are `space.kscience:visionforge-jupyter-gdml:0.2.0`. - -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-jupyter-gdml:0.2.0' -} -``` -**Gradle Kotlin DSL:** -```kotlin -repositories { - maven("https://repo.kotlin.link") - mavenCentral() -} - -dependencies { - implementation("space.kscience:visionforge-jupyter-gdml:0.2.0") -} -``` diff --git a/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt deleted file mode 100644 index d4ee507e..00000000 --- a/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt +++ /dev/null @@ -1,12 +0,0 @@ -package space.kscience.visionforge.gdml.jupyter - -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.ring.ThreeWithControlsPlugin -import space.kscience.visionforge.runVisionClient - -@DFExperimental -@JsExport -public fun main(): Unit = runVisionClient { - plugin(ThreeWithControlsPlugin) -} - diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt deleted file mode 100644 index 0d55be2e..00000000 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ /dev/null @@ -1,38 +0,0 @@ -package space.kscience.visionforge.gdml.jupyter - -import org.jetbrains.kotlinx.jupyter.api.libraries.resources -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.gdml.Gdml -import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.jupyter.VFIntegrationBase -import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.visionManager - -@DFExperimental -internal class GdmlForJupyter : VFIntegrationBase( - Context("GDML") { - plugin(Solids) - }.visionManager -) { - - override fun Builder.afterLoaded() { - - resources { - js("three") { - classPath("js/gdml-jupyter.js") - } - } - - import( - "space.kscience.gdml.*", - "space.kscience.visionforge.gdml.jupyter.*" - ) - - render { gdmlModel -> - handler.produceHtml { - vision { gdmlModel.toVision() } - } - } - } -} diff --git a/jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js b/jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js deleted file mode 100644 index 41da041c..00000000 --- a/jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js +++ /dev/null @@ -1,3 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e9e3deba..31119a06 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -64,6 +64,6 @@ include( ":demo:playground", // ":demo:plotly-fx", ":demo:js-playground", - ":jupyter", - ":jupyter:visionforge-jupyter-gdml" + ":visionforge-jupyter", + ":visionforge-jupyter:visionforge-jupyter-common" ) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt index de18ced5..f92454f0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt @@ -26,7 +26,7 @@ public data class VisionPage( } /** - * Use css with given stylesheet link as a global header for all pages. + * Use css with the given stylesheet link as a global header for all pages. */ public fun styleSheetHeader(href: String, block: LINK.() -> Unit = {}): HtmlFragment = { link { diff --git a/jupyter/README.md b/visionforge-jupyter/README.md similarity index 100% rename from jupyter/README.md rename to visionforge-jupyter/README.md diff --git a/jupyter/build.gradle.kts b/visionforge-jupyter/build.gradle.kts similarity index 86% rename from jupyter/build.gradle.kts rename to visionforge-jupyter/build.gradle.kts index 5808f287..ed4ab76d 100644 --- a/jupyter/build.gradle.kts +++ b/visionforge-jupyter/build.gradle.kts @@ -5,6 +5,7 @@ plugins { description = "Common visionforge jupyter module" kscience { + useKtor() jvm() js() jupyterLibrary() @@ -12,6 +13,7 @@ kscience { api(projects.visionforgeCore) } dependencies(jvmMain){ + api("io.ktor:ktor-server-cio") api(projects.visionforgeServer) } } diff --git a/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt similarity index 90% rename from jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt rename to visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt index f6a37f23..24304136 100644 --- a/jupyter/src/jsMain/kotlin/VFNotebookPlugin.kt +++ b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt @@ -13,7 +13,7 @@ import space.kscience.visionforge.renderAllVisionsById import space.kscience.visionforge.renderAllVisionsIn @JsExport -public class VFNotebookPlugin : AbstractPlugin() { +public class VFNotebookClient : AbstractPlugin() { private val client by require(VisionClient) public fun renderAllVisionsIn(element: Element) { @@ -39,8 +39,8 @@ public class VFNotebookPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @Suppress("NON_EXPORTABLE_TYPE") - public companion object : PluginFactory { - override fun build(context: Context, meta: Meta): VFNotebookPlugin = VFNotebookPlugin() + public companion object : PluginFactory { + override fun build(context: Context, meta: Meta): VFNotebookClient = VFNotebookClient() override val tag: PluginTag = PluginTag(name = "vision.notebook", group = PluginTag.DATAFORGE_GROUP) } diff --git a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt similarity index 88% rename from jupyter/src/jvmMain/kotlin/VFForNotebook.kt rename to visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt index 50619e44..0a538a3e 100644 --- a/jupyter/src/jvmMain/kotlin/VFForNotebook.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt @@ -16,9 +16,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.context.info import space.kscience.dataforge.context.logger -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.string +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager @@ -26,7 +24,6 @@ import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData -import space.kscience.visionforge.visionManager import kotlin.coroutines.CoroutineContext import kotlin.random.Random import kotlin.random.nextUInt @@ -41,9 +38,14 @@ internal fun TagConsumer<*>.renderScriptForId(id: String) { /** * A handler class that includes a server and common utilities */ -public class VFForNotebook(override val context: Context) : ContextAware, CoroutineScope { +public class VisionForge( + public val visionManager: VisionManager, + meta: Meta = Meta.EMPTY, +) : ContextAware, CoroutineScope { - public val visionManager: VisionManager = context.visionManager + override val context: Context get() = visionManager.context + + public val configuration: ObservableMutableMeta = meta.toMutableMeta() private var counter = 0 @@ -61,9 +63,11 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout public fun html(block: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(createHTML().apply(block).finalize()) + public fun getProperty(name: String): TypedMeta<*>? = configuration[name] ?: context.properties[name] + public fun startServer( - host: String = context.properties["visionforge.host"].string ?: "localhost", - port: Int = context.properties["visionforge.port"].int ?: VisionRoute.DEFAULT_PORT, + host: String = getProperty("visionforge.host").string ?: "localhost", + port: Int = getProperty("visionforge.port").int ?: VisionRoute.DEFAULT_PORT, ): MimeTypedResult = html { if (engine != null) { p { @@ -141,4 +145,4 @@ public class VFForNotebook(override val context: Context) : ContextAware, Corout public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) -} \ No newline at end of file +} diff --git a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt similarity index 85% rename from jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt rename to visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt index bf6322e9..3029ef32 100644 --- a/jupyter/src/jvmMain/kotlin/VFIntegrationBase.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt @@ -18,12 +18,12 @@ import kotlin.random.nextUInt * A base class for different Jupyter VF integrations */ @DFExperimental -public abstract class VFIntegrationBase( +public abstract class VisionForgeIntegration( public val visionManager: VisionManager, ) : JupyterIntegration(), ContextAware { override val context: Context get() = visionManager.context - protected val handler: VFForNotebook = VFForNotebook(visionManager.context) + protected val handler: VisionForge = VisionForge(visionManager) protected abstract fun Builder.afterLoaded() @@ -33,13 +33,15 @@ public abstract class VFIntegrationBase( declare("VisionForge" to handler, "vf" to handler) } + onShutdown { handler.stopServer() } import( "kotlinx.html.*", - "space.kscience.visionforge.html.*" + "space.kscience.visionforge.html.*", + "space.kscience.visionforge.jupyter.*" ) render { fragment -> @@ -54,7 +56,6 @@ public abstract class VFIntegrationBase( handler.produceHtml { vision(vision) } - } render { page -> @@ -93,4 +94,12 @@ public abstract class VFIntegrationBase( afterLoaded() } -} \ No newline at end of file +} + +/** + * Create a standalone page in the notebook + */ +public fun VisionForge.page( + pageHeaders: Map = emptyMap(), + content: HtmlVisionFragment +): VisionPage = VisionPage(visionManager, pageHeaders, content) \ No newline at end of file diff --git a/jupyter/src/jvmMain/kotlin/forms.kt b/visionforge-jupyter/src/jvmMain/kotlin/forms.kt similarity index 82% rename from jupyter/src/jvmMain/kotlin/forms.kt rename to visionforge-jupyter/src/jvmMain/kotlin/forms.kt index bccce2e7..fe072887 100644 --- a/jupyter/src/jvmMain/kotlin/forms.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/forms.kt @@ -11,11 +11,14 @@ import space.kscience.visionforge.html.VisionOfHtmlForm public class HtmlFormFragment internal constructor( public val vision: VisionOfHtmlForm, public val formBody: HtmlFragment, -){ +) { public val values: Meta? get() = vision.values public operator fun get(valueName: String): Meta? = values?.get(valueName) } +/** + * Top level function to create a form + */ public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment { val realId = id ?: "form[${builder.hashCode().toUInt()}]" return HtmlFormFragment(VisionOfHtmlForm(realId)) { @@ -24,4 +27,8 @@ public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlF builder() } } -} \ No newline at end of file +} + + +public fun VisionForge.form(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment = + HtmlFormFragment(id, builder) \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts similarity index 53% rename from jupyter/visionforge-jupyter-gdml/build.gradle.kts rename to visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts index 5a67459e..c71b33d0 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts @@ -2,10 +2,11 @@ plugins { id("space.kscience.gradle.mpp") } -description = "Jupyter api artifact for GDML rendering" +description = "Jupyter api artifact including all common modules" kscience { - fullStack("js/gdml-jupyter.js", + fullStack( + "js/visionforge-jupyter-common.js", jsConfig = { useCommonJs() } ) { commonWebpackConfig { @@ -16,21 +17,24 @@ kscience { } } - dependencies{ + dependencies { implementation(projects.visionforgeSolid) - implementation(projects.jupyter) + implementation(projects.visionforgePlotly) + implementation(projects.visionforgeTables) + implementation(projects.visionforgeMarkdown) + implementation(projects.visionforgeJupyter) } - dependencies(jvmMain){ + jvmMain { implementation(projects.visionforgeGdml) } - dependencies(jsMain){ - implementation(projects.visionforgeThreejs) + jsMain { implementation(projects.ui.ring) + implementation(projects.visionforgeThreejs) } - - jupyterLibrary("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") + + jupyterLibrary("space.kscience.visionforge.jupyter.JupyterCommonIntegration") } readme { diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt new file mode 100644 index 00000000..e5fb4edd --- /dev/null +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt @@ -0,0 +1,17 @@ +package space.kscience.visionforge.gdml.jupyter + +import space.kscience.visionforge.jupyter.VFNotebookClient +import space.kscience.visionforge.markup.MarkupPlugin +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.ring.ThreeWithControlsPlugin +import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.tables.TableVisionJsPlugin + +public fun main(): Unit = runVisionClient { + plugin(ThreeWithControlsPlugin) + plugin(PlotlyPlugin) + plugin(MarkupPlugin) + plugin(TableVisionJsPlugin) + plugin(VFNotebookClient) +} + diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt similarity index 51% rename from demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt rename to visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt index 0b87e06d..6bca7036 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt @@ -1,46 +1,52 @@ -package space.kscience.visionforge.examples +package space.kscience.visionforge.jupyter +import kotlinx.html.* import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot +import space.kscience.tables.* import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.jupyter.VFIntegrationBase +import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.tables.TableVisionPlugin +import space.kscience.visionforge.tables.toVision import space.kscience.visionforge.visionManager + @DFExperimental -internal class VisionForgePlayGroundForJupyter : VFIntegrationBase( - Context("VisionForge") { - plugin(Solids) - plugin(PlotlyPlugin) - }.visionManager -) { +public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionManager) { override fun Builder.afterLoaded() { + resources { - js("VisionForge") { - classPath("js/visionforge-playground.js") + js("three") { + classPath("js/visionforge-jupyter-common.js") } } import( "space.kscience.gdml.*", - "space.kscience.plotly.*", - "space.kscience.plotly.models.*", "space.kscience.visionforge.solid.*", + "space.kscience.tables.*", + "space.kscience.dataforge.meta.*", ) - render { gdmlModel -> handler.produceHtml { vision { gdmlModel.toVision() } } } + render> { table -> + handler.produceHtml { + vision { table.toVision() } + } + } + render { plot -> handler.produceHtml { vision { plot.asVision() } @@ -48,4 +54,12 @@ internal class VisionForgePlayGroundForJupyter : VFIntegrationBase( } } + public companion object { + private val CONTEXT: Context = Context("Jupyter-common") { + plugin(Solids) + plugin(PlotlyPlugin) + plugin(TableVisionPlugin) + plugin(MarkupPlugin) + } + } } diff --git a/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js b/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js new file mode 100644 index 00000000..cfb15cb8 --- /dev/null +++ b/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js @@ -0,0 +1,24 @@ +const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; + +const path = require('path'); + +config.module.rules.push(...ringConfig.module.rules) + +config.module.rules.push( + { + test: /\.css$/, + exclude: [ + path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") + ], + use: [ + { + loader: 'style-loader', + options: {} + }, + { + loader: 'css-loader', + options: {} + } + ] + } +) \ No newline at end of file diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index a4a7d848..00331969 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -6,7 +6,7 @@ kscience{ useKtor() dependencies { api(projects.visionforgeCore) - api("io.ktor:ktor-server-cio") + api("io.ktor:ktor-server-host-common") api("io.ktor:ktor-server-html-builder") api("io.ktor:ktor-server-websockets") implementation("io.ktor:ktor-server-cors") diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 84a87a65..47c5db84 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.server import io.ktor.http.* import io.ktor.server.application.* -import io.ktor.server.cio.* import io.ktor.server.engine.* import io.ktor.server.html.* import io.ktor.server.http.content.* diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index c58b849d..8b719b54 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -246,6 +246,6 @@ public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) /** * Add rotation with given [angle] relative to given [axis] */ -public fun Solid.rotate(angle: Angle, axis: DoubleVector3D) = with(QuaternionField) { +public fun Solid.rotate(angle: Angle, axis: DoubleVector3D): Unit = with(QuaternionField) { quaternion = Quaternion.fromRotation(angle, axis)*quaternion } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index f601a30e..791bb0c9 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -99,3 +99,8 @@ public inline fun MutableVisionContainer.solidGroup( name: String, action: SolidGroup.() -> Unit = {}, ): SolidGroup = solidGroup(name.parseAsName(), action) + +/** + * Create a [SolidGroup] using given configuration [block] + */ +public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block) \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 23d77912..cf813e6e 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -9,9 +9,9 @@ kscience { js { useCommonJs() binaries.library() - browser{ - commonWebpackConfig{ - cssSupport{ + browser { + commonWebpackConfig { + cssSupport { enabled.set(true) } } @@ -21,13 +21,13 @@ kscience { api(projects.visionforgeCore) api("space.kscience:tables-kt:${tablesVersion}") } - dependencies(jsMain){ - implementation(npm("tabulator-tables", "5.0.1")) - implementation(npm("@types/tabulator-tables", "5.0.1")) + dependencies(jsMain) { + implementation(npm("tabulator-tables", "5.4.4")) + implementation(npm("@types/tabulator-tables", "5.4.8")) } useSerialization() } -readme{ +readme { maturity = space.kscience.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index 20332974..3e4f9da8 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -86,6 +86,11 @@ public fun Table.toVision(): VisionOfTable = toVision { (it ?: "").asVal @JvmName("numberTableToVision") public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.NaN).asValue() } +@JvmName("anyTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { + (it as? Number)?.asValue() ?: it?.toString()?.asValue() ?: Null +} + @DFExperimental public inline fun VisionOutput.table( vararg headers: ColumnHeader, -- 2.34.1 From c1f275ce450f4471494a02a6ef9f4b61da748221 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 19 Jul 2023 22:54:13 +0300 Subject: [PATCH 134/143] Work-around for strange dependency resolution in notebooks --- demo/playground/notebooks/common-demo.ipynb | 77 ++++++++++--------- .../build.gradle.kts | 12 +-- visionforge-server/build.gradle.kts | 2 +- 3 files changed, 48 insertions(+), 43 deletions(-) diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb index 73409ae7..2c397a15 100644 --- a/demo/playground/notebooks/common-demo.ipynb +++ b/demo/playground/notebooks/common-demo.ipynb @@ -3,45 +3,50 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "@file:Repository(\"*mavenLocal\")\n", "@file:Repository(\"https://repo.kotlin.link\")\n", "@file:Repository(\"https://maven.pkg.jetbrains.space/spc/p/sci/dev\")\n", - "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")" + "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")\n", + "@file:DependsOn(\"io.ktor:ktor-server-cio-jvm:2.3.0\")\n", + "@file:DependsOn(\"io.ktor:ktor-server-websockets-jvm:2.3.0\")\n", + "@file:DependsOn(\"io.ktor:ktor-server-cors-jvm:2.3.0\")" ] }, { "cell_type": "code", "execution_count": null, - "outputs": [], - "source": [ - ":classpath" - ], "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ + "import io.ktor.server.cio.CIO\n", + "\n", + "println(CIO)\n", + "\n", "vf.startServer()" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ "import space.kscience.visionforge.plotly.plotly\n", + "import space.kscience.plotly.*\n", + "import space.kscience.plotly.models.*\n", "\n", "vf.page {\n", " h1 { +\"AAA\" }\n", @@ -65,19 +70,19 @@ " }\n", " }\n", "}" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": null, - "outputs": [], - "source": [], "metadata": { - "collapsed": false - } + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -86,19 +91,19 @@ "language": "kotlin", "name": "kotlin" }, - "language_info": { - "name": "kotlin", - "version": "1.8.20", - "mimetype": "text/x-kotlin", - "file_extension": ".kt", - "pygments_lexer": "kotlin", - "codemirror_mode": "text/x-kotlin", - "nbconvert_exporter": "" - }, "ktnbPluginMetadata": { "isAddProjectLibrariesToClasspath": false + }, + "language_info": { + "codemirror_mode": "text/x-kotlin", + "file_extension": ".kt", + "mimetype": "text/x-kotlin", + "name": "kotlin", + "nbconvert_exporter": "", + "pygments_lexer": "kotlin", + "version": "1.8.20" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts index c71b33d0..e6fd162b 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts +++ b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts @@ -18,15 +18,15 @@ kscience { } dependencies { - implementation(projects.visionforgeSolid) - implementation(projects.visionforgePlotly) - implementation(projects.visionforgeTables) - implementation(projects.visionforgeMarkdown) - implementation(projects.visionforgeJupyter) + api(projects.visionforgeSolid) + api(projects.visionforgePlotly) + api(projects.visionforgeTables) + api(projects.visionforgeMarkdown) + api(projects.visionforgeJupyter) } jvmMain { - implementation(projects.visionforgeGdml) + api(projects.visionforgeGdml) } jsMain { diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 00331969..59034dd1 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -9,7 +9,7 @@ kscience{ api("io.ktor:ktor-server-host-common") api("io.ktor:ktor-server-html-builder") api("io.ktor:ktor-server-websockets") - implementation("io.ktor:ktor-server-cors") + api("io.ktor:ktor-server-cors") } } -- 2.34.1 From 5783cf14300249f4d52599af25754178cfbbfdca Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jul 2023 08:58:41 +0300 Subject: [PATCH 135/143] Work-around for strange dependency resolution in notebooks --- demo/playground/notebooks/common-demo.ipynb | 34 ++++++++++++++++----- visionforge-jupyter/build.gradle.kts | 4 ++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb index 2c397a15..165acf2d 100644 --- a/demo/playground/notebooks/common-demo.ipynb +++ b/demo/playground/notebooks/common-demo.ipynb @@ -1,5 +1,16 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "//SessionOptions.resolveMpp = true" + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "code", "execution_count": null, @@ -10,9 +21,9 @@ "@file:Repository(\"https://repo.kotlin.link\")\n", "@file:Repository(\"https://maven.pkg.jetbrains.space/spc/p/sci/dev\")\n", "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")\n", - "@file:DependsOn(\"io.ktor:ktor-server-cio-jvm:2.3.0\")\n", - "@file:DependsOn(\"io.ktor:ktor-server-websockets-jvm:2.3.0\")\n", - "@file:DependsOn(\"io.ktor:ktor-server-cors-jvm:2.3.0\")" + "//@file:DependsOn(\"io.ktor:ktor-server-cio-jvm:2.3.0\")\n", + "//@file:DependsOn(\"io.ktor:ktor-server-websockets-jvm:2.3.0\")\n", + "//@file:DependsOn(\"io.ktor:ktor-server-cors-jvm:2.3.0\")" ] }, { @@ -26,10 +37,6 @@ }, "outputs": [], "source": [ - "import io.ktor.server.cio.CIO\n", - "\n", - "println(CIO)\n", - "\n", "vf.startServer()" ] }, @@ -82,7 +89,18 @@ } }, "outputs": [], - "source": [] + "source": [ + "vf.stopServer()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } } ], "metadata": { diff --git a/visionforge-jupyter/build.gradle.kts b/visionforge-jupyter/build.gradle.kts index ed4ab76d..49943631 100644 --- a/visionforge-jupyter/build.gradle.kts +++ b/visionforge-jupyter/build.gradle.kts @@ -13,7 +13,9 @@ kscience { api(projects.visionforgeCore) } dependencies(jvmMain){ - api("io.ktor:ktor-server-cio") + api("io.ktor:ktor-server-cio-jvm") + api("io.ktor:ktor-server-websockets-jvm") + api("io.ktor:ktor-server-cors-jvm") api(projects.visionforgeServer) } } -- 2.34.1 From a49a4f1a7f5ede88dee8a171a035476cd4e9371c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jul 2023 09:13:24 +0300 Subject: [PATCH 136/143] add plotly imports --- demo/playground/notebooks/common-demo.ipynb | 65 ++++++++++++------- .../kotlin/JupyterCommonIntegration.kt | 3 + 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb index 165acf2d..2e4b6110 100644 --- a/demo/playground/notebooks/common-demo.ipynb +++ b/demo/playground/notebooks/common-demo.ipynb @@ -2,59 +2,76 @@ "cells": [ { "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "//SessionOptions.resolveMpp = true" - ], + "execution_count": 2, "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, + "ExecuteTime": { + "end_time": "2023-07-20T06:12:13.305060400Z", + "start_time": "2023-07-20T06:12:13.011273800Z" + } + }, "outputs": [], "source": [ "@file:Repository(\"*mavenLocal\")\n", "@file:Repository(\"https://repo.kotlin.link\")\n", "@file:Repository(\"https://maven.pkg.jetbrains.space/spc/p/sci/dev\")\n", - "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")\n", - "//@file:DependsOn(\"io.ktor:ktor-server-cio-jvm:2.3.0\")\n", - "//@file:DependsOn(\"io.ktor:ktor-server-websockets-jvm:2.3.0\")\n", - "//@file:DependsOn(\"io.ktor:ktor-server-cors-jvm:2.3.0\")" + "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false + }, + "ExecuteTime": { + "end_time": "2023-07-20T06:12:19.603077Z", + "start_time": "2023-07-20T06:12:19.419504300Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": "

Starting VisionForge server on http://localhost:7777

\n" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "vf.startServer()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false + }, + "ExecuteTime": { + "end_time": "2023-07-20T06:12:21.490069100Z", + "start_time": "2023-07-20T06:12:20.694188600Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": "
\n

AAA

\n
\n \n
\n
\n \n
\n
\n\n" + }, + "execution_count": 4, + "metadata": { + "text/html": { + "isolated": true + } + }, + "output_type": "execute_result" + } + ], "source": [ - "import space.kscience.visionforge.plotly.plotly\n", - "import space.kscience.plotly.*\n", - "import space.kscience.plotly.models.*\n", - "\n", "vf.page {\n", " h1 { +\"AAA\" }\n", " vision {\n", diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt index 6bca7036..54f2e266 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt @@ -33,6 +33,9 @@ public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionMan "space.kscience.visionforge.solid.*", "space.kscience.tables.*", "space.kscience.dataforge.meta.*", + "space.kscience.plotly.*", + "space.kscience.plotly.models.*", + "space.kscience.visionforge.plotly.plotly" ) render { gdmlModel -> -- 2.34.1 From b3f68d879fd8be470f62f9aaf2567626491484f7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 22 Jul 2023 15:39:43 +0300 Subject: [PATCH 137/143] Jupyter renderers are working for lab and Idea --- build.gradle.kts | 2 +- demo/playground/build.gradle.kts | 2 +- demo/playground/notebooks/common-demo.ipynb | 85 +++------ .../visionforge/react/ThreeCanvasComponent.kt | 3 +- .../kscience/visionforge/html/HtmlFragment.kt | 33 ++-- .../visionforge/html/HtmlVisionRenderer.kt | 11 +- .../kscience/visionforge/html/VisionPage.kt | 6 +- .../kscience/visionforge/html/HtmlTagTest.kt | 4 +- .../kscience/visionforge/VisionClient.kt | 4 +- .../visionforge/html/HtmlVisionContext.kt | 8 +- .../kscience/visionforge/html/headers.kt | 6 +- .../kscience/visionforge/html/htmlExport.kt | 2 +- .../src/jsMain/kotlin/VFNotebookClient.kt | 5 +- .../src/jvmMain/kotlin/VisionForge.kt | 162 +++++++++++------- .../jvmMain/kotlin/VisionForgeIntegration.kt | 53 ++++-- .../kotlin/JupyterCommonIntegration.kt | 24 ++- .../visionforge/three/TestServerExtensions.kt | 3 +- 17 files changed, 226 insertions(+), 187 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 73f03bbd..35502755 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-11" + version = "0.3.0-dev-12" } subprojects { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 77dd565e..36bd6b7b 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,7 +51,7 @@ kotlin { implementation(projects.visionforgeMarkdown) implementation(projects.visionforgeTables) implementation(projects.cernRootLoader) - implementation(projects.visionforgeJupyter.visionforgeJupyterCommon) + api(projects.visionforgeJupyter.visionforgeJupyterCommon) } } diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb index 2e4b6110..78797545 100644 --- a/demo/playground/notebooks/common-demo.ipynb +++ b/demo/playground/notebooks/common-demo.ipynb @@ -2,77 +2,31 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { - "ExecuteTime": { - "end_time": "2023-07-20T06:12:13.305060400Z", - "start_time": "2023-07-20T06:12:13.011273800Z" - } + "tags": [] }, "outputs": [], "source": [ "@file:Repository(\"*mavenLocal\")\n", "@file:Repository(\"https://repo.kotlin.link\")\n", "@file:Repository(\"https://maven.pkg.jetbrains.space/spc/p/sci/dev\")\n", - "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-11\")" + "@file:DependsOn(\"space.kscience:visionforge-jupyter-common-jvm:0.3.0-dev-12\")\n", + "//import space.kscience.visionforge.jupyter.JupyterCommonIntegration\n", + "//\n", + "//val integration = JupyterCommonIntegration()\n", + "//USE(integration.getDefinitions(notebook).first())" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "ExecuteTime": { - "end_time": "2023-07-20T06:12:19.603077Z", - "start_time": "2023-07-20T06:12:19.419504300Z" - } + "tags": [] }, - "outputs": [ - { - "data": { - "text/html": "

Starting VisionForge server on http://localhost:7777

\n" - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "vf.startServer()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "ExecuteTime": { - "end_time": "2023-07-20T06:12:21.490069100Z", - "start_time": "2023-07-20T06:12:20.694188600Z" - } - }, - "outputs": [ - { - "data": { - "text/html": "
\n

AAA

\n
\n \n
\n
\n \n
\n
\n\n" - }, - "execution_count": 4, - "metadata": { - "text/html": { - "isolated": true - } - }, - "output_type": "execute_result" - } - ], - "source": [ - "vf.page {\n", + "vf.fragment {\n", " h1 { +\"AAA\" }\n", " vision {\n", " solid {\n", @@ -100,24 +54,27 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false - } + }, + "tags": [] }, "outputs": [], "source": [ - "vf.stopServer()" + "Plotly.plot { \n", + " scatter{\n", + " x(1,2,3)\n", + " y(1,2,3)\n", + " }\n", + "}" ] }, { "cell_type": "code", "execution_count": null, + "metadata": {}, "outputs": [], - "source": [], - "metadata": { - "collapsed": false - } + "source": [] } ], "metadata": { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 50c8a60a..8cfa515d 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.react import kotlinx.css.* import org.w3c.dom.Element -import org.w3c.dom.HTMLElement import react.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request @@ -29,7 +28,7 @@ public val ThreeCanvasComponent: FC = fc("ThreeCanvasComponent useEffect(props.solid, props.options, elementRef) { if (canvas == null) { - val element = elementRef.current as? HTMLElement ?: error("Canvas element not found") + val element = elementRef.current ?: error("Canvas element not found") canvas = ThreeCanvas(three, element, props.options ?: Canvas3DOptions()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt index b733e6a4..ec3f3605 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt @@ -4,19 +4,28 @@ import kotlinx.html.FlowContent import kotlinx.html.TagConsumer import kotlinx.html.stream.createHTML -public typealias HtmlFragment = TagConsumer<*>.() -> Unit - -public fun HtmlFragment.renderToString(): String = createHTML().apply(this).finalize() - -public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { - fragment() +/** + * A standalone HTML fragment + */ +public fun interface HtmlFragment { + public fun TagConsumer<*>.append() } -public fun FlowContent.fragment(fragment: HtmlFragment) { - fragment(consumer) -} +/** + * Convenience method to append fragment to the given [consumer] + */ +public fun HtmlFragment.appendTo(consumer: TagConsumer<*>): Unit = consumer.append() -public operator fun HtmlFragment.plus(other: HtmlFragment): HtmlFragment = { - this@plus() - other() +/** + * Create a string from this [HtmlFragment] + */ +public fun HtmlFragment.renderToString(): String = createHTML().apply { append() }.finalize() + +public fun TagConsumer<*>.appendFragment(fragment: HtmlFragment): Unit = fragment.appendTo(this) + +public fun FlowContent.appendFragment(fragment: HtmlFragment): Unit = fragment.appendTo(consumer) + +public operator fun HtmlFragment.plus(other: HtmlFragment): HtmlFragment = HtmlFragment { + this@plus.appendTo(this) + other.appendTo(this) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index d3c2427f..c02b6e64 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -2,18 +2,17 @@ package space.kscience.visionforge.html import kotlinx.html.* import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit - -@DFExperimental -public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content +public fun interface HtmlVisionFragment{ + public fun VisionTagConsumer<*>.append() +} +public fun HtmlVisionFragment.appendTo(consumer: VisionTagConsumer<*>): Unit = consumer.append() /** * Render a fragment in the given consumer and return a map of extracted visions @@ -84,7 +83,7 @@ public fun TagConsumer<*>.visionFragment( } } - fragment(consumer) + fragment.appendTo(consumer) } public fun FlowContent.visionFragment( diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt index f92454f0..1ea216c5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionPage.kt @@ -17,7 +17,7 @@ public data class VisionPage( /** * Use a script with given [src] as a global header for all pages. */ - public fun scriptHeader(src: String, block: SCRIPT.() -> Unit = {}): HtmlFragment = { + public fun scriptHeader(src: String, block: SCRIPT.() -> Unit = {}): HtmlFragment = HtmlFragment{ script { type = "text/javascript" this.src = src @@ -28,7 +28,7 @@ public data class VisionPage( /** * Use css with the given stylesheet link as a global header for all pages. */ - public fun styleSheetHeader(href: String, block: LINK.() -> Unit = {}): HtmlFragment = { + public fun styleSheetHeader(href: String, block: LINK.() -> Unit = {}): HtmlFragment = HtmlFragment{ link { rel = "stylesheet" this.href = href @@ -36,7 +36,7 @@ public data class VisionPage( } } - public fun title(title:String): HtmlFragment = { + public fun title(title:String): HtmlFragment = HtmlFragment{ title(title) } } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index efc7cfd0..eaea0a4e 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -24,7 +24,7 @@ fun FlowContent.renderVisionFragment( renderer(name, vision, outputMeta) } } - fragment(consumer) + fragment.appendTo(consumer) return visionMap } @@ -35,7 +35,7 @@ private fun VisionOutput.base(block: VisionGroup.() -> Unit) = context.visionMan @DFExperimental class HtmlTagTest { - val fragment: HtmlVisionFragment = { + val fragment = HtmlVisionFragment{ div { h1 { +"Head" } vision("ddd") { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 7d61ce24..c9146efd 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -286,8 +286,8 @@ public fun VisionClient.renderAllVisionsIn(element: Element) { /** * Render all visions in an element with a given [id] */ -public fun VisionClient.renderAllVisionsById(id: String): Unit = whenDocumentLoaded { - val element = getElementById(id) +public fun VisionClient.renderAllVisionsById(document: Document, id: String): Unit { + val element = document.getElementById(id) if (element != null) { renderAllVisionsIn(element) } else { diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt index 7d82da49..3796d436 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/HtmlVisionContext.kt @@ -34,10 +34,10 @@ public interface HtmlVisionContext : ContextAware { public typealias HtmlVisionContextFragment = context(HtmlVisionContext) TagConsumer<*>.() -> Unit -context(HtmlVisionContext) -public fun HtmlVisionFragment( - content: TagConsumer<*>.() -> Unit, -): HtmlVisionFragment = content +//context(HtmlVisionContext) +//public fun HtmlVisionFragment( +// content: TagConsumer<*>.() -> Unit, +//): HtmlVisionFragment = HtmlVisionFragment { } context(HtmlVisionContext) private fun TagConsumer.vision( diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index 4c4ab90a..bf880e84 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -91,14 +91,14 @@ internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String, */ internal fun fileScriptHeader( path: Path, -): HtmlFragment = { +): HtmlFragment = HtmlFragment{ script { type = "text/javascript" src = path.toString() } } -internal fun embedScriptHeader(resource: String, classLoader: ClassLoader): HtmlFragment = { +internal fun embedScriptHeader(resource: String, classLoader: ClassLoader): HtmlFragment = HtmlFragment{ script { type = "text/javascript" unsafe { @@ -113,7 +113,7 @@ internal fun fileCssHeader( cssPath: Path, resource: String, classLoader: ClassLoader, -): HtmlFragment = { +): HtmlFragment = HtmlFragment{ val relativePath = checkOrStoreFile(basePath, cssPath, resource, classLoader) link { rel = "stylesheet" diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt index ec31b7b4..e45dd9b5 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/htmlExport.kt @@ -78,7 +78,7 @@ public fun VisionPage.makeFile( charset = "utf-8" } actualHeaders.values.forEach { - fragment(it) + appendFragment(it) } } body { diff --git a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt index 24304136..84c6908b 100644 --- a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt +++ b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.jupyter import kotlinx.browser.window +import org.w3c.dom.Document import org.w3c.dom.Element import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.Context @@ -20,8 +21,8 @@ public class VFNotebookClient : AbstractPlugin() { client.renderAllVisionsIn(element) } - public fun renderAllVisionsById(id: String) { - client.renderAllVisionsById(id) + public fun renderAllVisionsById(document: Document, id: String) { + client.renderAllVisionsById(document, id) } public fun renderAllVisions() { diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt index 0a538a3e..d2acefde 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.html.* import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.KotlinKernelHost import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware @@ -20,24 +21,33 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.visionFragment +import space.kscience.visionforge.html.* import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData import kotlin.coroutines.CoroutineContext import kotlin.random.Random import kotlin.random.nextUInt -internal fun TagConsumer<*>.renderScriptForId(id: String) { - script { - type = "text/javascript" - unsafe { +"VisionForge.renderAllVisionsById(\"$id\");" } - } + +@Suppress("FunctionName") +internal inline fun HTML(isolated: Boolean = false, block: TagConsumer<*>.() -> Unit): MimeTypedResult = + HTML(createHTML().apply(block).finalize(), isolated) + +internal fun KotlinKernelHost.displayHtml(block: TagConsumer<*>.() -> Unit) { + display(HTML(false, block), null) +} + +public enum class VisionForgeCompatibility { + JUPYTER, + JUPYTER_LAB, + DATALORE, + IDEA } /** * A handler class that includes a server and common utilities */ +@Suppress("ExtractKtorModule") public class VisionForge( public val visionManager: VisionManager, meta: Meta = Meta.EMPTY, @@ -51,29 +61,28 @@ public class VisionForge( private var engine: ApplicationEngine? = null - public var isolateFragments: Boolean = false + public var notebookMode: VisionForgeCompatibility = VisionForgeCompatibility.IDEA override val coroutineContext: CoroutineContext get() = context.coroutineContext - public fun legacyMode() { - isolateFragments = true - } public fun isServerRunning(): Boolean = engine != null - public fun html(block: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(createHTML().apply(block).finalize()) - public fun getProperty(name: String): TypedMeta<*>? = configuration[name] ?: context.properties[name] - public fun startServer( + internal fun startServer( + kernel: KotlinKernelHost, host: String = getProperty("visionforge.host").string ?: "localhost", port: Int = getProperty("visionforge.port").int ?: VisionRoute.DEFAULT_PORT, - ): MimeTypedResult = html { + ) { if (engine != null) { - p { - style = "color: red;" - +"Stopping current VisionForge server" + kernel.displayHtml { + p { + style = "color: red;" + +"Stopping current VisionForge server" + } } + } //val connector: EngineConnectorConfig = EngineConnectorConfig(host, port) @@ -83,66 +92,91 @@ public class VisionForge( install(WebSockets) }.start(false) - p { - style = "color: blue;" - +"Starting VisionForge server on http://$host:$port" + kernel.displayHtml { + p { + style = "color: blue;" + +"Starting VisionForge server on port $port" + } } } - public fun stopServer() { + internal fun stopServer(kernel: KotlinKernelHost) { engine?.apply { logger.info { "Stopping VisionForge server" } stop(1000, 2000) engine = null } - } - private fun produceHtmlString( - fragment: HtmlVisionFragment, - ): String = createHTML().apply { - val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" - div { - this.id = id - val engine = engine - if (engine != null) { - //if server exist, serve dynamically - //server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) - val cellRoute = "content-${counter++}" - - val collector: MutableMap = mutableMapOf() - - val url = engine.environment.connectors.first().let { - url { - protocol = URLProtocol.WS - host = it.host - port = it.port - pathSegments = listOf(cellRoute, "ws") - } - } - - engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), collector) - - visionFragment( - visionManager, - embedData = true, - updatesUrl = url, - onVisionRendered = { name, vision -> collector[name] = vision }, - fragment = fragment - ) - } else { - //if not, use static rendering - visionFragment(visionManager, fragment = fragment) + kernel.displayHtml { + p { + style = "color: red;" + +"VisionForge server stopped" } } - renderScriptForId(id) - }.finalize() + } - public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = - HTML(produceHtmlString(fragment), isolated ?: isolateFragments) + internal fun TagConsumer<*>.renderScriptForId(id: String, iframeIsolation: Boolean = false) { + script { + type = "text/javascript" + if (iframeIsolation) { + //language=JavaScript + unsafe { +"parent.VisionForge.renderAllVisionsById(document, \"$id\");" } + } else { + //language=JavaScript + unsafe { +"VisionForge.renderAllVisionsById(document, \"$id\");" } + } + } + } - public fun fragment(body: HtmlVisionFragment): MimeTypedResult = produceHtml(fragment = body) - public fun page(body: HtmlVisionFragment): MimeTypedResult = produceHtml(true, body) + + public fun produceHtml( + isolated: Boolean? = null, + fragment: HtmlVisionFragment, + ): MimeTypedResult { + val iframeIsolation = isolated + ?: (notebookMode == VisionForgeCompatibility.JUPYTER || notebookMode == VisionForgeCompatibility.DATALORE) + return HTML( + iframeIsolation + ) { + val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" + div { + this.id = id + val engine = engine + if (engine != null) { + //if server exist, serve dynamically + //server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) + val cellRoute = "content-${counter++}" + + val collector: MutableMap = mutableMapOf() + + val url = engine.environment.connectors.first().let { + url { + protocol = URLProtocol.WS + host = it.host + port = it.port + pathSegments = listOf(cellRoute, "ws") + } + } + + engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), collector) + + visionFragment( + visionManager, + embedData = true, + updatesUrl = url, + onVisionRendered = { name, vision -> collector[name] = vision }, + fragment = fragment + ) + } else { + //if not, use static rendering + visionFragment(visionManager, fragment = fragment) + } + } + renderScriptForId(id, iframeIsolation = iframeIsolation) + } + } public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) } + diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt index 3029ef32..e7175dd0 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt @@ -1,8 +1,7 @@ package space.kscience.visionforge.jupyter import kotlinx.html.* -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import space.kscience.dataforge.context.Context @@ -31,11 +30,12 @@ public abstract class VisionForgeIntegration( onLoaded { declare("VisionForge" to handler, "vf" to handler) + handler.startServer(this) } onShutdown { - handler.stopServer() + handler.stopServer(this) } import( @@ -43,14 +43,14 @@ public abstract class VisionForgeIntegration( "space.kscience.visionforge.html.*", "space.kscience.visionforge.jupyter.*" ) - - render { fragment -> - handler.produceHtml(fragment = fragment) - } - - render { fragment -> - handler.produceHtml(fragment = fragment) - } +// +// render { fragment -> +// HTML(fragment.renderToString()) +// } +// +// render { fragment -> +// handler.produceHtml(fragment = fragment) +// } render { vision -> handler.produceHtml { @@ -59,13 +59,13 @@ public abstract class VisionForgeIntegration( } render { page -> - HTML(createHTML().apply { + HTML(true) { head { meta { charset = "utf-8" } page.pageHeaders.values.forEach { - fragment(it) + appendFragment(it) } } body { @@ -74,9 +74,11 @@ public abstract class VisionForgeIntegration( this.id = id visionFragment(visionManager, fragment = page.content) } - renderScriptForId(id) + with(handler) { + renderScriptForId(id, true) + } } - }.finalize(), true) + } } render { fragment -> @@ -87,7 +89,7 @@ public abstract class VisionForgeIntegration( +"The server is not running. Forms are not interactive. Start server with `VisionForge.startServer()." } } - fragment(fragment.formBody) + appendFragment(fragment.formBody) vision(fragment.vision) } } @@ -96,10 +98,25 @@ public abstract class VisionForgeIntegration( } } + +/** + * Create a fragment without a head to be embedded in the page + */ +@Suppress("UnusedReceiverParameter") +public fun VisionForge.html(body: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(false, body) + + +/** + * Create a fragment without a head to be embedded in the page + */ +public fun VisionForge.fragment(body: VisionTagConsumer<*>.() -> Unit): MimeTypedResult = produceHtml(false, body) + + /** * Create a standalone page in the notebook */ public fun VisionForge.page( pageHeaders: Map = emptyMap(), - content: HtmlVisionFragment -): VisionPage = VisionPage(visionManager, pageHeaders, content) \ No newline at end of file + body: VisionTagConsumer<*>.() -> Unit, +): VisionPage = VisionPage(visionManager, pageHeaders, body) + diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt index 54f2e266..c326a816 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt @@ -6,8 +6,12 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot +import space.kscience.plotly.PlotlyPage +import space.kscience.plotly.StaticPlotlyRenderer import space.kscience.tables.* import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.VisionPage import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision @@ -23,7 +27,7 @@ public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionMan override fun Builder.afterLoaded() { resources { - js("three") { + js("visionforge-common") { classPath("js/visionforge-jupyter-common.js") } } @@ -55,6 +59,24 @@ public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionMan vision { plot.asVision() } } } + + + render { plotlyPage -> + val headers = plotlyPage.headers.associate { plotlyFragment -> + plotlyFragment.hashCode().toString(16) to HtmlFragment { + plotlyFragment.visit(this) + } + + } + VisionPage(visionManager, headers) { + div{ + p { +"Plotly page renderer is not recommended in VisionForge, use `vf.page{}`" } + } + div { + plotlyPage.fragment.render.invoke(this, StaticPlotlyRenderer) + } + } + } } public companion object { diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt index ef4eb39b..95d9e6f7 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmTest/kotlin/space/kscience/visionforge/three/TestServerExtensions.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.three import kotlinx.html.stream.createHTML import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.html.appendTo import space.kscience.visionforge.html.importScriptHeader import kotlin.test.Test @@ -15,7 +16,7 @@ class TestServerExtensions { VisionPage.importScriptHeader( "js/visionforge-three.js", ResourceLocation.SYSTEM - ).invoke(this) + ).appendTo(this) }.finalize() -- 2.34.1 From ed491bdae093d5e54ba5f6289d3350a3cd94f7b6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 22 Jul 2023 18:25:11 +0300 Subject: [PATCH 138/143] cleanup --- .../src/jsMain/kotlin/VFNotebookClient.kt | 5 +-- .../src/jvmMain/kotlin/VisionForge.kt | 35 ++++++++----------- .../jvmMain/kotlin/VisionForgeIntegration.kt | 33 +++++++++++------ .../kotlin/JupyterCommonIntegration.kt | 8 ++--- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt index 84c6908b..7f06c6ac 100644 --- a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt +++ b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt @@ -31,9 +31,10 @@ public class VFNotebookClient : AbstractPlugin() { init { + console.info("Loading VisionForge global hooks") //register VisionForge in the browser window - window.asDynamic().vf = this - window.asDynamic().VisionForge = this + window.parent.asDynamic().vf = this + window.parent.asDynamic().VisionForge = this } @Suppress("NON_EXPORTABLE_TYPE") diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt index d2acefde..49d5fe23 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt @@ -10,9 +10,7 @@ import io.ktor.server.websocket.WebSockets import kotlinx.coroutines.CoroutineScope import kotlinx.html.* import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.KotlinKernelHost -import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult +import org.jetbrains.kotlinx.jupyter.api.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.context.info @@ -21,7 +19,8 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.* +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData import kotlin.coroutines.CoroutineContext @@ -50,6 +49,7 @@ public enum class VisionForgeCompatibility { @Suppress("ExtractKtorModule") public class VisionForge( public val visionManager: VisionManager, + public val notebook: Notebook, meta: Meta = Meta.EMPTY, ) : ContextAware, CoroutineScope { @@ -61,8 +61,6 @@ public class VisionForge( private var engine: ApplicationEngine? = null - public var notebookMode: VisionForgeCompatibility = VisionForgeCompatibility.IDEA - override val coroutineContext: CoroutineContext get() = context.coroutineContext @@ -75,19 +73,19 @@ public class VisionForge( host: String = getProperty("visionforge.host").string ?: "localhost", port: Int = getProperty("visionforge.port").int ?: VisionRoute.DEFAULT_PORT, ) { - if (engine != null) { + engine?.let { kernel.displayHtml { p { style = "color: red;" +"Stopping current VisionForge server" } } - + it.stop(1000, 2000) } //val connector: EngineConnectorConfig = EngineConnectorConfig(host, port) - engine?.stop(1000, 2000) + engine = context.embeddedServer(CIO, port, host) { install(WebSockets) }.start(false) @@ -115,16 +113,11 @@ public class VisionForge( } } - internal fun TagConsumer<*>.renderScriptForId(id: String, iframeIsolation: Boolean = false) { + internal fun TagConsumer<*>.renderScriptForId(id: String) { script { type = "text/javascript" - if (iframeIsolation) { - //language=JavaScript - unsafe { +"parent.VisionForge.renderAllVisionsById(document, \"$id\");" } - } else { - //language=JavaScript - unsafe { +"VisionForge.renderAllVisionsById(document, \"$id\");" } - } + //language=JavaScript + unsafe { +"parent.VisionForge.renderAllVisionsById(document, \"$id\");" } } } @@ -133,8 +126,10 @@ public class VisionForge( isolated: Boolean? = null, fragment: HtmlVisionFragment, ): MimeTypedResult { - val iframeIsolation = isolated - ?: (notebookMode == VisionForgeCompatibility.JUPYTER || notebookMode == VisionForgeCompatibility.DATALORE) + val iframeIsolation = isolated ?: when (notebook.jupyterClientType) { + JupyterClientType.DATALORE, JupyterClientType.JUPYTER_NOTEBOOK -> true + else -> false + } return HTML( iframeIsolation ) { @@ -172,7 +167,7 @@ public class VisionForge( visionFragment(visionManager, fragment = fragment) } } - renderScriptForId(id, iframeIsolation = iframeIsolation) + renderScriptForId(id) } } diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt index e7175dd0..afc2ecc2 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.jupyter import kotlinx.html.* +import org.jetbrains.kotlinx.jupyter.api.KotlinKernelHost import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration @@ -22,20 +23,30 @@ public abstract class VisionForgeIntegration( ) : JupyterIntegration(), ContextAware { override val context: Context get() = visionManager.context - protected val handler: VisionForge = VisionForge(visionManager) - protected abstract fun Builder.afterLoaded() + protected abstract fun Builder.afterLoaded(vf: VisionForge) final override fun Builder.onLoaded() { + val vf: VisionForge = VisionForge(visionManager, notebook) + onLoaded { - declare("VisionForge" to handler, "vf" to handler) - handler.startServer(this) + val kernel: KotlinKernelHost = this + declare("VisionForge" to vf, "vf" to vf) + vf.startServer(kernel) + vf.configuration.onChange(this) { name -> + if (name.toString() == "visionforge.port") { + kernel.displayHtml { + p { +"Property 'visionforge.port' changed. Restarting server" } + } + vf.startServer(kernel) + } + } } onShutdown { - handler.stopServer(this) + vf.stopServer(this) } import( @@ -53,7 +64,7 @@ public abstract class VisionForgeIntegration( // } render { vision -> - handler.produceHtml { + vf.produceHtml { vision(vision) } } @@ -74,16 +85,16 @@ public abstract class VisionForgeIntegration( this.id = id visionFragment(visionManager, fragment = page.content) } - with(handler) { - renderScriptForId(id, true) + with(vf) { + renderScriptForId(id) } } } } render { fragment -> - handler.produceHtml { - if (!handler.isServerRunning()) { + vf.produceHtml { + if (!vf.isServerRunning()) { p { style = "color: red;" +"The server is not running. Forms are not interactive. Start server with `VisionForge.startServer()." @@ -94,7 +105,7 @@ public abstract class VisionForgeIntegration( } } - afterLoaded() + afterLoaded(vf) } } diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt index c326a816..6200bd5d 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt @@ -24,7 +24,7 @@ import space.kscience.visionforge.visionManager @DFExperimental public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionManager) { - override fun Builder.afterLoaded() { + override fun Builder.afterLoaded(vf: VisionForge) { resources { js("visionforge-common") { @@ -43,19 +43,19 @@ public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionMan ) render { gdmlModel -> - handler.produceHtml { + vf.produceHtml { vision { gdmlModel.toVision() } } } render> { table -> - handler.produceHtml { + vf.produceHtml { vision { table.toVision() } } } render { plot -> - handler.produceHtml { + vf.produceHtml { vision { plot.asVision() } } } -- 2.34.1 From f5fba4747eb6e107b761f0c8cd6513cbb7236dc6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 25 Jul 2023 13:35:55 +0300 Subject: [PATCH 139/143] Some refactoring and new server demo --- CHANGELOG.md | 2 + build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 2 +- .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 4 +- .../src/main/kotlin/JsPlaygroundApp.kt | 4 +- .../src/main/kotlin/gravityDemo.kt | 4 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 6 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 4 +- demo/playground/src/jvmMain/kotlin/antenna.kt | 91 +++++++++++++++---- .../src/jvmMain/kotlin/gdmlCurve.kt | 4 +- .../src/jvmMain/kotlin/randomSpheres.kt | 4 +- .../src/jvmMain/kotlin/rootParser.kt | 4 +- .../src/jvmMain/kotlin/serverExtensions.kt | 52 +++++++++++ demo/playground/src/jvmMain/kotlin/shapes.kt | 8 +- .../src/jvmMain/kotlin/simpleCube.kt | 4 +- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 2 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +- .../src/main/kotlin/ru/mipt/npm/sat/static.kt | 4 +- .../kscience/visionforge/solid/demo/demo.kt | 30 +++--- .../ThreeWithControlsPlugin.kt | 18 +++- .../visionforge/gdml/GdmlLoaderOptions.kt | 2 +- .../visionforge/server/VisionServer.kt | 6 +- .../visionforge/solid/ColorAccessor.kt | 8 +- .../kscience/visionforge/solid/LightSource.kt | 2 +- .../kscience/visionforge/solid/SolidGroup.kt | 5 + .../kscience/visionforge/solid/Solids.kt | 4 + .../visionforge/solid/CompositeTest.kt | 2 +- .../kscience/visionforge/solid/GroupTest.kt | 6 +- .../visionforge/solid/SerializationTest.kt | 6 +- .../visionforge/solid/SolidPropertyTest.kt | 4 +- .../visionforge/solid/SolidReferenceTest.kt | 2 +- .../visionforge/solid/VisionUpdateTest.kt | 4 +- 33 files changed, 215 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afc740a3..dbb44a80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - MeshLine for thick lines ### Changed +- Color accessor property is now `colorProperty`. Color uses `invoke` instead of `set` - API update for server and pages - Edges moved to solids module for easier construction - Visions **must** be rooted in order to subscribe to updates. @@ -20,6 +21,7 @@ ### Removed ### Fixed +- Jupyter integration for IDEA and Jupyter lab. ### Security diff --git a/build.gradle.kts b/build.gradle.kts index 35502755..68c3569b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-12" + version = "0.3.0-dev-13" } subprojects { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index a2e1f70a..be9372b5 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -328,7 +328,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? group }.apply { volume.fMedium?.let { medium -> - color.set(context.colorCache.getOrPut(medium.meta) { RootColors[11 + context.colorCache.size] }) + color(context.colorCache.getOrPut(medium.meta) { RootColors[11 + context.colorCache.size] }) } if (!context.ignoreRootColors) { diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 4301966a..37c178f4 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -23,7 +23,7 @@ import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.invoke import styled.css import styled.styledDiv @@ -53,7 +53,7 @@ val GDMLApp = fc("GDMLApp") { props -> console.info("Marking layers for file $name") markLayers() ambientLight { - color.set(Colors.white) + color(Colors.white) } } } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index cdca1957..7c6514bf 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -12,7 +12,7 @@ import space.kscience.visionforge.react.createRoot import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication import styled.injectGlobal @@ -49,7 +49,7 @@ private class GDMLDemoApp : Application { child(GDMLApp) { val vision = GdmlShowCase.cubes().toVision().apply { ambientLight { - color.set(Colors.white) + color(Colors.white) } } //println(context.plugins.fetch(VisionManager).encodeToString(vision)) diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index cb6eb3e6..d77d8f52 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -76,7 +76,7 @@ private class JsPlaygroundApp : Application { solids = playgroundContext.request(Solids) solid { ambientLight { - color.set(Colors.white) + color(Colors.white) } repeat(100) { sphere(5, name = "sphere[$it]") { @@ -84,7 +84,7 @@ private class JsPlaygroundApp : Application { y = random.nextDouble(-300.0, 300.0) z = random.nextDouble(-300.0, 300.0) material { - color.set(random.nextInt()) + color(random.nextInt()) } detail = 16 } diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index c04baf98..a4bc9057 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -42,13 +42,13 @@ val GravityDemo = fc { props -> solids = props.solids solid { pointLight(200, 200, 200, name = "light"){ - color.set(Colors.white) + color(Colors.white) } ambientLight() sphere(5.0, "ball") { detail = 16 - color.set("red") + color("red") val h = 100.0 y = h solids.context.launch { diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 82c20def..f11c9e01 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -39,7 +39,7 @@ class Model(val manager: VisionManager) { val root: SolidGroup = SolidGroup().apply { setAsRoot(this@Model.manager) material { - color.set("darkgreen") + color("darkgreen") } rotationX = PI / 2 solidGroup("bottom") { @@ -64,7 +64,7 @@ class Model(val manager: VisionManager) { private fun highlight(pixel: String) { println("highlight $pixel") - map[pixel]?.color.set("blue") + map[pixel]?.color("blue") } fun reset() { @@ -82,7 +82,7 @@ class Model(val manager: VisionManager) { } event.track?.let { tracks.polyline(*it.toTypedArray(), name = "track[${event.id}]") { - color.set("red") + color("red") } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 4c9649c6..07dc7c7c 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -26,7 +26,7 @@ import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.edges -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv @@ -58,7 +58,7 @@ val MMApp = fc("Muon monitor") { props -> props.model.root.apply { edges() ambientLight{ - color.set(Colors.white) + color(Colors.white) } } } diff --git a/demo/playground/src/jvmMain/kotlin/antenna.kt b/demo/playground/src/jvmMain/kotlin/antenna.kt index cd711d11..6e9b759b 100644 --- a/demo/playground/src/jvmMain/kotlin/antenna.kt +++ b/demo/playground/src/jvmMain/kotlin/antenna.kt @@ -1,16 +1,19 @@ package space.kscience.visionforge.examples +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import space.kscience.dataforge.meta.configure import space.kscience.kmath.complex.Quaternion import space.kscience.kmath.complex.QuaternionField -import space.kscience.kmath.geometry.Angle -import space.kscience.kmath.geometry.Euclidean3DSpace -import space.kscience.kmath.geometry.degrees -import space.kscience.kmath.geometry.fromRotation -import space.kscience.visionforge.html.ResourceLocation +import space.kscience.kmath.complex.conjugate +import space.kscience.kmath.geometry.* import space.kscience.visionforge.solid.* import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin -fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { +fun main() = serve { val azimuth = 60.degrees val inclination = 15.degrees @@ -22,28 +25,76 @@ fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { //val direction2 = Quaternion.fromEuler(Angle.zero, Angle.piDiv2 - inclination, -azimuth, RotationOrder.ZYX) + val target = Quaternion.fromEuler((-45).degrees, 45.degrees, Angle.zero, RotationOrder.XYZ) + vision("canvas") { requirePlugin(Solids) - solid { + + solid(options = { + configure { "controls.enabled" put false } + }) { rotationX = -PI / 2 rotationZ = PI - axes(200) + //axes(200) ambientLight() - cylinder(50, 5, name = "base") - solidGroup("frame") { - z = 60 - axes(200) - solidGroup("antenna") { - tube(40, 10, 30) - sphereLayer(100, 95, theta = PI / 6) { - z = 100 - rotationX = -PI / 2 + val platform = solidGroup("platform") { + cylinder(50, 5, name = "base") + solidGroup("frame") { + z = 60 + + val antenna = solidGroup("antenna") { + axes(200) + tube(40, 10, 30) + sphereLayer(100, 95, theta = PI / 6) { + z = 100 + rotationX = -PI / 2 + } + cylinder(5, 30) { + z = 15 + } + + sphereLayer(101, 94, phi = PI / 32, theta = PI / 6) { + z = 100 + rotationX = -PI / 2 + color("red") + } + + quaternion = target } - cylinder(5, 30) { - z = 15 + } + } + + val frame = platform["frame"] as SolidGroup + + val antenna = frame["antenna"] as SolidGroup + + val xPeriod = 5000 //ms + val yPeriod = 7000 //ms + + val incRot = Quaternion.fromRotation(30.degrees, Euclidean3DSpace.zAxis) + + + val rotationJob = context.launch { + var time: Long = 0L + while (isActive) { + with(QuaternionField) { + delay(200) + platform.quaternion = Quaternion.fromRotation( + 15.degrees * sin(time.toDouble() * 2 * PI / xPeriod), + Euclidean3DSpace.xAxis + ) * Quaternion.fromRotation( + 15.degrees * cos(time * 2 * PI / yPeriod), + Euclidean3DSpace.yAxis + ) + + val qi = platform.quaternion * incRot + + antenna.quaternion = qi.conjugate * incRot.conjugate * target + + time += 200 + //antenna.quaternion = Quaternion.fromRotation(5.degrees, Euclidean3DSpace.zAxis) * antenna.quaternion } - quaternion = direction } } } diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index c2af2a8f..4cac02b1 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.color -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.visible import java.nio.file.Path @@ -229,7 +229,7 @@ fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceL visible = false } if(solid.name.startsWith("gas")){ - color.set("green") + color("green") } else { //make all solids semi-transparent transparent() diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index 47201ff8..fd1b9865 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -19,7 +19,7 @@ fun main() = makeVisionFile( vision { solid { ambientLight { - color.set(Colors.white) + color(Colors.white) } repeat(100) { sphere(5, name = "sphere[$it]") { @@ -27,7 +27,7 @@ fun main() = makeVisionFile( y = random.nextDouble(-300.0, 300.0) z = random.nextDouble(-300.0, 300.0) material { - color.set(random.nextInt()) + color(random.nextInt()) } detail = 16 } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index be70faf8..d5fea32e 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -11,7 +11,7 @@ import space.kscience.visionforge.Colors import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight -import space.kscience.visionforge.solid.set +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.solid import java.util.zip.ZipInputStream import kotlin.io.path.Path @@ -44,7 +44,7 @@ fun main() { requirePlugin(Solids) solid { ambientLight { - color.set(Colors.white) + color(Colors.white) } rootGeo(geo,"BM@N", maxLayer = 3, ignoreRootColors = true).also { Path("data/BM@N.vf.json").writeText(Solids.encodeToString(it)) diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 9eb87730..c20f27c7 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -1,11 +1,24 @@ package space.kscience.visionforge.examples +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.http.content.staticResources +import io.ktor.server.routing.routing +import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Global import space.kscience.visionforge.html.* +import space.kscience.visionforge.markup.MarkupPlugin +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.visionPage +import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path + public fun makeVisionFile( path: Path? = null, title: String = "VisionForge page", @@ -26,6 +39,45 @@ public fun makeVisionFile( if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } +public fun serve( + title: String = "VisionForge page", + show: Boolean = true, + content: HtmlVisionFragment, +) { + val context = Context("playground") { + plugin(Solids) + plugin(PlotlyPlugin) + plugin(MarkupPlugin) + plugin(TableVisionPlugin) + } + + val server = embeddedServer(CIO, port = 7779) { + routing { + staticResources("", null, null) + } + + visionPage( + context.visionManager, + VisionPage.scriptHeader("js/visionforge-playground.js") { + defer = true + }, + VisionPage.title(title), + visionFragment = content + ) + }.start(false) + + if (show) { + server.openInBrowser() + } + + println("Enter 'exit' to close server") + while (readlnOrNull() != "exit") { + // + } + + server.close() +} + //@DFExperimental //public fun Context.makeVisionFile( // vision: Vision, diff --git a/demo/playground/src/jvmMain/kotlin/shapes.kt b/demo/playground/src/jvmMain/kotlin/shapes.kt index a338d123..55ce28d5 100644 --- a/demo/playground/src/jvmMain/kotlin/shapes.kt +++ b/demo/playground/src/jvmMain/kotlin/shapes.kt @@ -10,23 +10,23 @@ fun main() = makeVisionFile { ambientLight() box(100.0, 100.0, 100.0) { z = -110.0 - color.set("teal") + color("teal") } sphere(50.0) { x = 110 detail = 16 - color.set("red") + color("red") } tube(50, height = 10, innerRadius = 25, angle = PI) { y = 110 detail = 16 rotationX = PI / 4 - color.set("blue") + color("blue") } sphereLayer(50, 40, theta = PI / 2) { rotationX = -PI * 3 / 4 z = 110 - color.set(Colors.pink) + color(Colors.pink) } diff --git a/demo/playground/src/jvmMain/kotlin/simpleCube.kt b/demo/playground/src/jvmMain/kotlin/simpleCube.kt index 5dae515c..e1fc91eb 100644 --- a/demo/playground/src/jvmMain/kotlin/simpleCube.kt +++ b/demo/playground/src/jvmMain/kotlin/simpleCube.kt @@ -2,8 +2,8 @@ package space.kscience.visionforge.examples import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.material -import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.solid fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { @@ -11,7 +11,7 @@ fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { solid { box(100, 100, 100) material { - emissiveColor.set("red") + emissiveColor("red") } } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index 052fb6e0..d2c30422 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -15,7 +15,7 @@ internal fun Solids.visionOfSatellite( ySegmentSize: Number = xSegmentSize, fiberDiameter: Number = 1.0, ): SolidGroup = solidGroup { - color.set("darkgreen") + color("darkgreen") val transparent by style { this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3 } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 9e0c8282..9f2f7e59 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -33,7 +33,7 @@ fun main() { //Create a geometry val sat = solids.visionOfSatellite(ySegments = 3).apply { ambientLight { - color.set(Colors.white) + color(Colors.white) } } val server = embeddedServer(CIO, port = 7777) { @@ -63,7 +63,7 @@ fun main() { val randomJ = Random.nextInt(1, 4) val target = Name.parse("layer[$randomLayer].segment[$randomI,$randomJ]") val targetVision = sat[target] as Solid - targetVision.color.set("red") + targetVision.color("red") delay(1000) //use to ensure that color is cleared targetVision.color.value = Null diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt index 2a1fd240..89dc3a09 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt @@ -3,8 +3,8 @@ package ru.mipt.npm.sat import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.material -import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.solid import space.kscience.visionforge.three.makeThreeJsFile @@ -14,7 +14,7 @@ fun main() = makeThreeJsFile(resourceLocation = ResourceLocation.SYSTEM) { solid { box(100, 100, 100) material { - emissiveColor.set("red") + emissiveColor("red") } } } diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index baee4c71..9e2ecedb 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -23,7 +23,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro val vision = solids.solidGroup { block() ambientLight { - color.set(Colors.white) + color(Colors.white) } } render(Name.parse(name), vision, meta) @@ -49,23 +49,23 @@ fun VisionLayout.showcase() { ambientLight() box(100.0, 100.0, 100.0) { z = -110.0 - color.set("teal") + color("teal") } sphere(50.0) { x = 110 detail = 16 - color.set("red") + color("red") } tube(50, height = 10, innerRadius = 25, angle = PI) { y = 110 detail = 16 rotationX = PI / 4 - color.set("blue") + color("blue") } sphereLayer(50, 40, theta = PI / 2) { rotationX = -PI * 3 / 4 z = 110 - color.set(Colors.pink) + color(Colors.pink) } } @@ -80,7 +80,7 @@ fun VisionLayout.showcase() { visible = false x = 110.0 //override color for this cube - color.set(1530) + color(1530) GlobalScope.launch(Dispatchers.Main) { while (isActive) { @@ -95,7 +95,7 @@ fun VisionLayout.showcase() { val random = Random(111) while (isActive) { delay(1000) - group.color.set(random.nextInt(0, Int.MAX_VALUE)) + group.color(random.nextInt(0, Int.MAX_VALUE)) } } } @@ -114,7 +114,7 @@ fun VisionLayout.showcase() { rotate((PI/20).radians,Euclidean3DSpace.yAxis) } } - color.set(Colors.red) + color(Colors.red) } } } @@ -127,7 +127,7 @@ fun VisionLayout.showcase() { for (i in 0..100) { layer(i * 5, 20 * sin(2 * PI / 100 * i), 20 * cos(2 * PI / 100 * i)) } - color.set(Colors.teal) + color(Colors.teal) rotationX = -PI / 2 } } @@ -136,7 +136,7 @@ fun VisionLayout.showcase() { sphere(100) { detail = 32 opacity = 0.4 - color.set(Colors.blue) + color(Colors.blue) } repeat(20) { polyline( @@ -145,7 +145,7 @@ fun VisionLayout.showcase() { ) { thickness = 3.0 rotationX = it * PI2 / 20 - color.set(Colors.green) + color(Colors.green) //rotationY = it * PI2 / 20 } } @@ -176,7 +176,7 @@ fun VisionLayout.showcaseCSG() { detail = 32 } material { - color.set(Colors.pink) + color(Colors.pink) } } composite(CompositeType.UNION) { @@ -186,7 +186,7 @@ fun VisionLayout.showcaseCSG() { sphere(50) { detail = 32 } - color.set("lightgreen") + color("lightgreen") opacity = 0.7 } composite(CompositeType.SUBTRACT) { @@ -197,7 +197,7 @@ fun VisionLayout.showcaseCSG() { sphere(50) { detail = 32 } - color.set("teal") + color("teal") opacity = 0.7 } } @@ -208,7 +208,7 @@ fun VisionLayout.showcaseCSG() { detail = 32 } box(100, 100, 100) - color.set("red") + color("red") opacity = 0.5 } } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index dd7f8e0d..94259b2f 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -7,12 +7,15 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solid +import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.ThreePlugin public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { @@ -24,11 +27,16 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { - space.kscience.visionforge.react.createRoot(element).render { - child(ThreeCanvasWithControls) { - attrs { - this.solids = three.solids - this.builderOfSolid = context.async { vision as Solid} + if(meta["controls.enabled"].boolean == false){ + three.render(element, name, vision, meta) + } else { + space.kscience.visionforge.react.createRoot(element).render { + child(ThreeCanvasWithControls) { + attrs { + this.solids = three.solids + this.options = Canvas3DOptions.read(meta) + this.builderOfSolid = context.async { vision as Solid } + } } } } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt index 56158c55..2d3c18c9 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt @@ -42,7 +42,7 @@ public class GdmlLoaderOptions { * Configure paint for given solid with given [GdmlMaterial] */ public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = - { material, _ -> color.set(randomColor(material)) } + { material, _ -> color(randomColor(material)) } private set public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 47c5db84..61952497 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -57,7 +57,7 @@ public class VisionRoute( override val context: Context get() = visionManager.context /** - * Update minimal interval between updates in milliseconds (if there are no updates, push will not happen + * Update the minimal interval between updates in milliseconds (if there are no updates, push will not happen */ public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) @@ -170,8 +170,8 @@ public fun Application.visionPage( meta { charset = "utf-8" } - headers.forEach { header -> - consumer.header() + headers.forEach { headerContent -> + headerContent.appendTo(consumer) } } body { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 01abf310..60789027 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -28,7 +28,7 @@ public class ColorAccessor( } } -public fun Vision.color( +public fun Vision.colorProperty( propertyName: Name? = null, ): ReadOnlyProperty = ReadOnlyProperty { _, property -> ColorAccessor(properties.root(true), propertyName ?: property.name.asName()) @@ -43,21 +43,21 @@ public var ColorAccessor?.string: String? /** * Set [webcolor](https://en.wikipedia.org/wiki/Web_colors) as string */ -public fun ColorAccessor?.set(webColor: String) { +public operator fun ColorAccessor?.invoke(webColor: String) { this?.value = webColor.asValue() } /** * Set color as RGB integer */ -public fun ColorAccessor?.set(rgb: Int) { +public operator fun ColorAccessor?.invoke(rgb: Int) { this?.value = Colors.rgbToString(rgb).asValue() } /** * Set color as RGB */ -public fun ColorAccessor?.set(r: UByte, g: UByte, b: UByte) { +public operator fun ColorAccessor?.invoke(r: UByte, g: UByte, b: UByte) { this?.value = Colors.rgbToString(r, g, b).asValue() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index beeb4eb3..6064e6ed 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -15,7 +15,7 @@ import space.kscience.visionforge.* public abstract class LightSource : SolidBase() { override val descriptor: MetaDescriptor get() = LightSource.descriptor - public val color: ColorAccessor by color(SolidMaterial.COLOR_KEY) + public val color: ColorAccessor by colorProperty(SolidMaterial.COLOR_KEY) public var intensity: Number by properties.root(includeStyles = false).number(INTENSITY_KEY) { 1.0 } public companion object { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 791bb0c9..8e04b638 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -43,6 +43,9 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable it to value }.toMap() + /** + * Get a child solid with given relative [name] if it exists + */ public operator fun get(name: Name): Solid? = children.getChild(name) as? Solid private var prototypes: SolidGroup? @@ -84,6 +87,8 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable } } +public operator fun SolidGroup.get(name:String): Solid? = get(name.parseAsName()) + @VisionBuilder public inline fun MutableVisionContainer.solidGroup( name: Name? = null, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index e9301f67..1477c2a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -94,3 +94,7 @@ public inline fun VisionOutput.solid(options: Canvas3DOptions? = null, block: So } } } + +@VisionBuilder +public inline fun VisionOutput.solid(options: Canvas3DOptions.() -> Unit, block: SolidGroup.() -> Unit): SolidGroup = + solid(Canvas3DOptions(options), block) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt index e426aee2..a7c1c688 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/CompositeTest.kt @@ -18,7 +18,7 @@ class CompositeTest { detail = 32 } material { - color.set("pink") + color("pink") } } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt index 7f5138b1..78e2f03c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/GroupTest.kt @@ -18,7 +18,7 @@ class GroupTest { } box(100, 100, 100) material { - color.set(Colors.lightgreen) + color(Colors.lightgreen) opacity = 0.3f } } @@ -30,7 +30,7 @@ class GroupTest { } box(100, 100, 100) y = 300 - color.set(Colors.red) + color(Colors.red) } subtract("subtract") { box(100, 100, 100) { @@ -40,7 +40,7 @@ class GroupTest { } box(100, 100, 100) y = -300 - color.set(Colors.blue) + color(Colors.blue) } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 2497b5b3..e3069647 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -24,7 +24,7 @@ class SerializationTest { @Test fun testCubeSerialization() { val cube = Box(100f, 100f, 100f).apply { - color.set(222) + color(222) x = 100 z = -100 } @@ -37,7 +37,7 @@ class SerializationTest { @Test fun testProxySerialization() { val cube = Box(100f, 100f, 100f).apply { - color.set(222) + color(222) x = 100 z = -100 } @@ -59,7 +59,7 @@ class SerializationTest { fun lightSerialization(){ val group = testSolids.solidGroup { ambientLight { - color.set(Colors.white) + color(Colors.white) intensity = 100.0 } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 5fa22b86..87ba368c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -20,7 +20,7 @@ class SolidPropertyTest { val box = Box(10.0f, 10.0f, 10.0f) box.material { //meta["color"] = "pink" - color.set("pink") + color("pink") } assertEquals("pink", box.properties.getValue("material.color")?.string) assertEquals("pink", box.color.string) @@ -41,7 +41,7 @@ class SolidPropertyTest { delay(5) box.material { - color.set("pink") + color("pink") } assertEquals("pink", c.await()) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index 8e851cb5..d8d971bb 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -16,7 +16,7 @@ class SolidReferenceTest { SolidMaterial.MATERIAL_COLOR_KEY put "red" } newRef("test", Box(100f,100f,100f).apply { - color.set("blue") + color("blue") useStyle(theStyle) }) } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 50e9362d..0e495aaa 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -22,7 +22,7 @@ internal class VisionUpdateTest { } val dif = visionManager.VisionChange { solidGroup("top") { - color.set(123) + color(123) box(100, 100, 100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) @@ -41,7 +41,7 @@ internal class VisionUpdateTest { fun testVisionChangeSerialization() { val change = visionManager.VisionChange { solidGroup("top") { - color.set(123) + color(123) box(100, 100, 100) } propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) -- 2.34.1 From 1e29c5dbaa7a52ea5cde8513ac82a4a8a134455c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 22 Aug 2023 21:47:07 +0300 Subject: [PATCH 140/143] add a workaround for root duplicating names --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 27 +++++++++--------- .../src/jvmMain/kotlin/rootParser.kt | 2 +- .../resources/root/geometry_run_7-2076.zip | Bin 0 -> 48731 bytes .../kscience/visionforge/solid/SolidGroup.kt | 2 +- .../visionforge/solid/SolidReference.kt | 15 +++++++--- 5 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index be9372b5..13b1cb55 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -4,6 +4,7 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.withIndex import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.isEmpty import space.kscience.visionforge.set @@ -223,7 +224,7 @@ private fun SolidGroup.addShape( "TGeoShapeAssembly" -> { val fVolume by shape.dObject(::DGeoVolume) fVolume?.let { volume -> - addRootVolume(volume, context, block = block) + addRootVolume(volume, context, name = volume.fName.ifEmpty { null }, block = block) } } @@ -348,29 +349,29 @@ private fun SolidGroup.addRootVolume( cache: Boolean = true, block: Solid.() -> Unit = {}, ) { - - val combinedName = if (volume.fName.isEmpty()) { - name - } else if (name == null) { - volume.fName - } else { - "${name}_${volume.fName}" + val combinedName = name?.parseAsName()?.let { + // this fix is required to work around malformed root files with duplicated node names + if (get(it) != null) { + it.withIndex(volume.hashCode().toString(16)) + } else { + it + } } if (!cache) { - val group = buildVolume(volume, context)?.apply(block) - setChild(combinedName?.let { Name.parse(it) }, group) + val group = buildVolume(volume, context)?.apply(block) ?: return + setChild(combinedName, group) } else { val templateName = volumesName + volume.name - val existing = getPrototype(templateName) + val existing = context.prototypeHolder.getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - val group = buildVolume(volume, context) + val group = buildVolume(volume, context) ?: return@prototypes setChild(templateName, group) } } - ref(templateName, name).apply(block) + ref(templateName, combinedName).apply(block) } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index d5fea32e..85a2f0d3 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -26,7 +26,7 @@ private fun Meta.countTypes(): Sequence = sequence { } fun main() { - val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { + val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/geometry_run_7-2076.zip")!!).use { it.nextEntry it.readAllBytes().decodeToString() } diff --git a/demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip b/demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip new file mode 100644 index 0000000000000000000000000000000000000000..1680404cd90cbb11d16f618bbda808c0c0208873 GIT binary patch literal 48731 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.() -> Unit) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 80db0b3e..7203f06f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -2,7 +2,9 @@ package space.kscience.visionforge.solid import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -61,7 +63,7 @@ public class SolidReference( } override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { - if(name == Vision.STYLE_KEY){ + if (name == Vision.STYLE_KEY) { return buildList { properties?.getValue(Vision.STYLE_KEY)?.list?.forEach { add(it) @@ -90,7 +92,7 @@ public class SolidReference( prototype.getStyleProperty(name)?.value?.let { return it } } - if(inheritFlag){ + if (inheritFlag) { //5. own inheritance parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } //6. prototype inheritance @@ -226,9 +228,14 @@ internal class SolidReferenceChild( */ public fun MutableVisionContainer.ref( templateName: Name, - name: String? = null, + name: Name? = null, ): SolidReference = SolidReference(templateName).also { setChild(name, it) } +public fun MutableVisionContainer.ref( + templateName: Name, + name: String? = null, +): SolidReference = ref(templateName, name?.parseAsName()) + public fun MutableVisionContainer.ref( templateName: String, name: String? = null, -- 2.34.1 From 3529d0efc64302e538694638c75a58c8d8a4ff45 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 22 Aug 2023 22:52:17 +0300 Subject: [PATCH 141/143] Fix polygon builders --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 6 +++--- .../playground/src/jvmMain/kotlin/extruded.kt | 21 +++++++++++++++++++ .../src/jvmMain/kotlin/rootParser.kt | 2 +- .../kscience/visionforge/VisionManager.kt | 2 -- .../kscience/visionforge/gdml/gdmlLoader.kt | 4 ++-- .../kscience/visionforge/solid/Extruded.kt | 2 -- 6 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/extruded.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 13b1cb55..07112c06 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -209,9 +209,9 @@ private fun SolidGroup.addShape( require(fNz > 1) { "The polyhedron geometry requires at least two planes" } val baseRadius = fRmax[0] shape { - (0..fNedges).forEach { - val phi = deltaphi * fNedges * it + startphi - (baseRadius * cos(phi) to baseRadius * sin(phi)) + (0.. diff --git a/demo/playground/src/jvmMain/kotlin/extruded.kt b/demo/playground/src/jvmMain/kotlin/extruded.kt new file mode 100644 index 00000000..8a25549f --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/extruded.kt @@ -0,0 +1,21 @@ +package space.kscience.visionforge.examples + +import space.kscience.visionforge.solid.ambientLight +import space.kscience.visionforge.solid.extruded +import space.kscience.visionforge.solid.polygon +import space.kscience.visionforge.solid.solid + +fun main() = makeVisionFile { + vision("canvas") { + solid { + ambientLight() + extruded("extruded") { + shape{ + polygon(8, 100) + layer(-30) + layer(30) + } + } + } + } +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 85a2f0d3..1faa8d0b 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -46,7 +46,7 @@ fun main() { ambientLight { color(Colors.white) } - rootGeo(geo,"BM@N", maxLayer = 3, ignoreRootColors = true).also { + rootGeo(geo,"BM@N", ignoreRootColors = true).also { Path("data/BM@N.vf.json").writeText(Solids.encodeToString(it)) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 2be8a6b3..e4ca1cdb 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -35,7 +35,6 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont public val jsonFormat: Json get() = Json(defaultJson) { - encodeDefaults = false serializersModule = this@VisionManager.serializersModule } @@ -85,7 +84,6 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont serializersModule = defaultSerialModule prettyPrint = true useArrayPolymorphism = false - encodeDefaults = false ignoreUnknownKeys = true explicitNulls = false } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 230af4b0..0c81d258 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -207,9 +207,9 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { require(solid.planes.size > 1) { "The polyhedron geometry requires at least two planes" } val baseRadius = solid.planes.first().rmax * lScale shape { - (0..solid.numsides).forEach { + (0.. diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 1a6487b9..014db562 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -23,8 +23,6 @@ public class Shape2DBuilder(private val points: ArrayList = Arr points.add(Float32Vector2D(x, y)) } - public infix fun Number.to(y: Number): Unit = point(this, y) - public fun build(): Shape2D = points } -- 2.34.1 From cd28f377abb4c2b0c033a6861a47d7cef4b24023 Mon Sep 17 00:00:00 2001 From: SPC-code <112205870+SPC-code@users.noreply.github.com> Date: Wed, 23 Aug 2023 09:24:17 +0300 Subject: [PATCH 142/143] Update build.yml --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c73f7d9..4b57e1c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,15 +8,15 @@ on: jobs: build: runs-on: ubuntu-latest - timeout-minutes: 40 + timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.5.3 - name: Set up JDK 11 - uses: actions/setup-java@v2.5.0 + uses: actions/setup-java@v3.12.0 with: java-version: 11 distribution: liberica - name: execute build - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v2.7.1 with: arguments: build -- 2.34.1 From 6a801f9999df5d29640802f74f6bff5c93ceff51 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 23 Aug 2023 09:34:58 +0300 Subject: [PATCH 143/143] Fix solid ref signature --- .../kscience/visionforge/solid/SolidReference.kt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 7203f06f..2770a7aa 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -233,13 +233,8 @@ public fun MutableVisionContainer.ref( public fun MutableVisionContainer.ref( templateName: Name, - name: String? = null, -): SolidReference = ref(templateName, name?.parseAsName()) - -public fun MutableVisionContainer.ref( - templateName: String, - name: String? = null, -): SolidReference = ref(Name.parse(templateName), name) + name: String, +): SolidReference = ref(templateName, name.parseAsName()) /** * Add new [SolidReference] wrapping given object and automatically adding it to the prototypes. @@ -258,7 +253,7 @@ public fun SolidGroup.newRef( } else if (existing != obj) { error("Can't add different prototype on top of existing one") } - return children.ref(prototypeName, name) + return children.ref(prototypeName, name?.parseAsName()) } -- 2.34.1