From 0ad485c24541e840f2a3f3e633ad2d1e8d4b81d8 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 07:07:08 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1164-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1164-001.md | 9 + docs/tasks/WBV2-P1164-001.md | 48 + .../web/compositor_node_batch_scene.blend | Bin 0 -> 98715 bytes tests/golden/WBV2-P1164-000/manifest.json | 48 + .../WBV2-P1164-000/module-execution-plan.json | 8824 +++++++++++++++++ .../compositor-main-reader-production.json | 132 + tests/golden/WBV2-P1164-001/manifest.json | 104 + .../golden/WBV2-P1164-001/module-receipt.json | 143 + tests/golden/WBV2-P1164-001/module-run.log | 49 + tests/golden/WBV2-P1164-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 9580 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1164-001.md create mode 100644 docs/tasks/WBV2-P1164-001.md create mode 100644 tests/files/web/compositor_node_batch_scene.blend create mode 100644 tests/golden/WBV2-P1164-000/manifest.json create mode 100644 tests/golden/WBV2-P1164-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1164-001/compositor-main-reader-production.json create mode 100644 tests/golden/WBV2-P1164-001/manifest.json create mode 100644 tests/golden/WBV2-P1164-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1164-001/module-run.log create mode 100644 tests/golden/WBV2-P1164-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 8b3bd3826..7eb159b18 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1163-001` | -| parent manifest | `tests/golden/WBV2-P1163-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1163-001.md`](tasks/WBV2-P1163-001.md) | +| 当前任务 | `WBV2-P1164-001` | +| parent manifest | `tests/golden/WBV2-P1164-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1164-001.md`](tasks/WBV2-P1164-001.md) | | 专项验收 | `node tools/web/check-execution-control-plane.mjs` | | legacy coverage checkpoint | `M16-GAP-00282` | | legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` | diff --git a/docs/status/WBV2-P1164-001.md b/docs/status/WBV2-P1164-001.md new file mode 100644 index 000000000..13de205ba --- /dev/null +++ b/docs/status/WBV2-P1164-001.md @@ -0,0 +1,9 @@ +# WBV2-P1164-001 status + +- task: `WBV2-P1164-001`; module: `COMPOSITOR_NATIVE_NODE_BATCH`; status: `done` +- source hashes stable: `true`; commands passed: `4` +- existing production evidence reused: `false`; skipped commands: `0` +- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt +- dynamic source inventory: `3745` units; verified `529`; unverified `3216`; planning estimate `5200` (non-binding); this-segment binding delta: `3` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1164-001.md b/docs/tasks/WBV2-P1164-001.md new file mode 100644 index 000000000..727b17cf5 --- /dev/null +++ b/docs/tasks/WBV2-P1164-001.md @@ -0,0 +1,48 @@ +# WBV2-P1164-001: verify native compositor transform blur alpha reader + +- task: WBV2-P1164-001 +- parent: WBV2-P1164-000 +- status: in_progress +- gap: capability:COMPOSITOR_NATIVE_NODE_BATCH +- ownerFamily: MEDIA +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587 +- selectedRecordIds: ["node:CompositorNodeTransform","node:CompositorNodeBlur","node:CompositorNodeAlphaOver"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1164-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeTransform, CompositorNodeBlur, CompositorNodeAlphaOver, CompositorNodeViewer 的真实 modifier/RNA 元数据。 + +## 输入与范围 + +- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/` +- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc` +- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Fixtures: `tests/files/web/compositor_node_batch_scene.blend` +- Chromium test: `web/tests/e2e/compositor-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:CompositorNodeTransform`, `modifier-source:CompositorNodeBlur`, `modifier-source:CompositorNodeAlphaOver`, `modifier-source:CompositorNodeViewer` +- Selected RNA units: none (source-only dependency batch) + +## 验收 + +- one shared Main/WASM/Worker/Chromium chain observes every selected type +- malformed input is rejected without Main mutation +- save/reopen and deterministic second read are exact +- only Chromium is used; JS simulation and per-API duplicate workers are forbidden +- each selected source unit receives an explicit hash-bound coverage binding +- `node tools/web/check-task-context.mjs --task WBV2-P1164-001 --write` + +## 失败边界 + +- any missing source, unsupported type, hash drift, malformed data or non-exact recovery keeps the batch `in_progress`/`blocked` +- partial batch success never claims the omitted family; historical inventory remains read-only + +## 交付与回滚 + +- Receipt: `tests/golden/WBV2-P1164-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1164-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1164-001/manifest.json` +- Status: `docs/status/WBV2-P1164-001.md` +- Rollback: restore WBV2-P1164-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/compositor_node_batch_scene.blend b/tests/files/web/compositor_node_batch_scene.blend new file mode 100644 index 0000000000000000000000000000000000000000..f34fd47cac3e6974d00afe697a808cfbb36830eb GIT binary patch literal 98715 zcmWh!18^l<5Ph+2Zfx7e#;3$xH&yfIcK1EqeR_K8)*Y%Q z#?O3VND#npPC&4Ph^)B0n7A@CCp{ChI}!1sX+fCd4)eP5`UnAw{FRK-

I+^16tQjRorK=>t`i zRX(`6xw{b&5qZ7^K+!QUc#KU=C!%6vfd9*=tEnq1DZjHYGgrXD!ZJWWKwwBnN@j+H zg}o~(C_d5B(xyW~LjC}!q@pr%_w+oKla;%nASVy~7Q{h8MP=62)9Z_jj+T*@IVC0{ zat8$kMFa;2M-~zmjt>kDeij!K-^RnkGXntufdM5YCDn3vaoJZ>RRanN3jRY!M^{Eb zK%i1nS8rBTQT^oQ;psy{LK6Bm0?*CE6XYKl`1C(G4tDkiI5;>q5CTF%MLP$Fbu}eL z#TO<<#v*8FXfjwhI8tR*)w=M=$S+-8J$X5~dnzibxNm@1D;o%EQNd8Q6 zadqDakBoYciTn2Se@SN-w=E$d;Yd_eGydwcaMEB zafw7MENtHIoI!%Yz`*`sU}Ut^H#F)B3JHCPj*b8R0lj^E&t+ug@^SI-#J)KS`V9`( z*FWGgDkkp#VPC(18$~7MQet9ag>P0O{0|!ypMXI0e^jn+9y^iWV7_w_7##YfuC7u4 z?UB}ZP?5f;gvPTWQ2#@$5cRVmSH0)JJSFi26K+V6|ferpYY$|GM-ER)#OUf#U zRD3Jl^nw!+v9ZwsQb5#%o@bC_Lq!N@%%L1=)qNNNNubDX_BQqo9`>?U_GU)TM9O9+ z44h2dhh*~tNZncj6*{?mIv6bi${3u2O85`_Xfs>_W2;I0*y=8V{x@X-Da`SsGo#7H zQn+9N5W_^G;lbhM!>EQrMCb^C$gsl5h{DiJ!9+&TB;dqC&@`bU=*q*)L#|mMrscG( zp|%RlxbL~9L+D77Zap2`0>U)uTmw0NT@$F&sx%T_=vkXP- zjhh37p$O)__qQj05}5b|1{8uZT^=$S3?q!j^#SwPW$`I|$wb zf5Y(rlCwuTkRKt4bN85G`g74L&$7?NUlig}y|)$f{<0qJd*^VJzj2P9 zFLky+#wPx>pYU=r+xw8wd}8HmY1D%!#P7xEQ zSm#XI?v9ngsQzz#9VCzd^f(YN^8y7GWTLQ5b9k`?%a}+h(z{qg-*n;?K<@}|sa|^*Px3A8Xub1uPys>RIefF$_-QfP(Ad6sq+RH`O z1`9+p_&xY2cpuUwLu^3cTJea;kzdr$5UUydI9nL*#KG`5`U3TK4A(jnNCW~$4)DKB z2;-8xfvV|{5&J)87**X~hyNUh`Z}K%%l@|Zd6T3d`Mm}u*ysR{wdhD`hy1d*Kc6&Q zm=AsaLTrEAPG133vhjIqT4MYtdiB#?#MdD8-2nQ}_#vms)R4;J(N2DGYG7AA;#Z$6 z|9aIz)QbU%0{=Do=9GxofeJc8BaZMY24k`(jMwBheRXjz%ZQOAtob-7(qTpo#jI;+ z;tspdF)@huctRuWFDsDmfl07#wAqD;u11^>n^h;*n0@ZH==Ju`n-#qwVX? z;|;VkWBINx6BOXNOjJoW{;R8q%*>Mc0lNUrOf$idB3iKlbg)dJ4d)ikgV&yTuq^^* zS>O_aBpD^~ahsxYgYJb2|3hS%&-ALS8OL!K1E%;Y7)w_Aa>q6}Nm$4QPA1;nx-d8K z6O~M+Ggx2KCXxIt!8QPiPpP%#4#jCfKN`n@ke1#N`EFKI&>)MO_X96RszMgoe^T`Tm2`DXG_vi^U z2DCEn?s0{>No)RY(LZ?5Ce-3lER-4sCOlfzpR~XHSr$`CkxC0N0gFBa1J){I)~vJSSvA!5h!H(c>cfiw7O1BL_krC>u=7NyBvP&Zo)9rB z$s&g7nIt+l*F4{K(GPSvsR#-oNH**xo%{q`i1&8KJKEi-ku9z<6Miz4?*ZaS96-#+b6@S^Tmveb_z$ZlVC65@6?d%4`I`+SSk3aCnY( zKK|Ir?lA~oN$qa@-iyJA7zPF%88g&^-Kv_n9I5_yHu^ieUHKwT{rg;n!h3q%WkRfw#e?L0 zacC}(tv*$h%$nMAE?y;cW^ANAsdf&ASe{#Nwk%QuFMH&CRBi?F@{<>ylGV&O5 z1x|zsX^4oc_35$hU?NGKrFS93YoitPnT`VAi(ve5J6N;+wGjyh?IQCJ!%FX53S2J7rco(@Jwghb@8<88RXR4r5 zxVeN7b9x|rPI-LP03E~iM5Stj;B_HFnht61aJLUI6XdAzC&(W{b@}E}#@x9Zb9oa( zw6xx)WnVT-P!`{;*ZvzN+AcGk;jeSlHII*1bC1 zIV`7sR@9%r(b7a`*8WXB@CorzdmVrNnQf+QzDAl5@$p=S=Uoj$SnSn_5kvqKI zUD?rmQEt6JCq>(n5J0U6X$0uE^;iG8lC&?Z^_M;|)Kt$zut+aD4xT0TY+i$iEpTZ( z3V@&lPw-?|sMR-%nGB=Lhf+1KCAK1>3?X&f`q;W)3W=1>B_F_~JrX1MdkC3Fi?})0X$dUSBa-cX#Rz>&LK}spk0u~zZ19HNm7N!XLAA6Wq7v`tTjS3@p~gcc zhe;evGT**3y07(qX@MA?A@*~;kh*)$ml~v}vVvRV;%fuU6l41)Z8!)QEl@l%#Clf{ zN7B6*l=ibxsrLC{IVwM(Whd`D?vKre&{Wpd87B;DDh-SGG0*CAQ43B-Bm)ut?rjCv zZ#^XS@ITW-g!BTRdJvJ&eDh(fy<;e*fl7kh_@4)kxdSmj=8PS7fir8hhdHkSng%-V zA7KP=bfe*`e^2cPX~b@6l*yQyeiTJtR)x)|54hcP`}G-qXEc0scJ_uMI{vW>3K^}R zwn|QZIP}>6VDz7?f-2F$0y8|I4x+-^l@ag$6v{yFI=FgU{tx_6hky$GW zQig1r9t16RoRS4=5fuolqFl>OrA$JZjeS;-X;=nzj@Yi?A5?nyFU0^4lg8IhKmKN- zfpY3sXnz13zTryoE|Upa%unPk9FkaALl?!52SqtYuLA5K_kf#91UL-A3S84;jr7F` zF!-zj9b7Cy?tnn6c6uE3@O~rYb`+*OBEEu?iAGAbiCsB6s&Z+JwxiG$I!J;oCZdp< zNXt(l1W>(fHr>?ivU+UPPtTvdsu8L&?~ncl&>o>5u)Tu{G$G)mA<_jOM9BMqOMpv^ zQ7*wx>@yIVK#rR}BrKZT$v<-o(JFsobLTlBgVAPWQ<@i+gx4a`P1aJN1^+~|LqnK| zXyON8fhL0*|M()8v!d~2XmZU+@kvkxa0zan3Sb2E4woY z@v}JywOiAz8}sj$VHly(Pr#YU%r_akYn|Ic@%B&Tg2(zROlx4S+z_mRkSe87^a9RK za9{JNt8UW!-zOiFsTZ(dg+l0Fqe_9qBfNrOa5k_070jktR;WWLUFS_}QPJ5qWHJ72 z4CVn%39^DbrTTpaeQx{MQPP~dGvFRw?eNVnrz1K3v z1SIR!VnnWf7axHMF=PA+Acah8wBC!``f`rcl3j$&L^DmtIAeQx-QPm7Rxvr3IC810 zRhJB|5f)h=6D;3Ncd>~xHSsCbF>HR{ZTDnashE+xEhQ5_BK7pVDGhk4!*uKc_U^CkE;Rx3==J*T19?#c@QaE7H-a@inm2<# zl09u*)8h@_Eh|q}a}{I)5Y#sR-IB;!Aivw}m+hA5K>=zw&k|FX+yVKCkXJOKs~(13 zko@zj!`^aruHPkPm^;ES(#37U#pjgQhu_pgdR72P?n?mWR<{Wx5F0+T%A1Zfl`=+C z*0r;+5CXR=I8{%Lk2KY<1#j#tjyxX<6ns?bOE9ef_^+P_Z_XdxB%EC1(~y(W-gRR` zkX#;$C|kwmQZ@ooI5&^XT2p5RH=BvDw}FYZ_EGvnN;oX;)gq8rLhUJJ8u>I>+cA zWLr=P74HIqQbPyeLmO$(8@WXXrIK=ob!2T5lMqqv$%bkX;LuEc)!EbGH|Myl+Hwqx z)W2)g=X;W}o5D}HMOi1W0;cb3ju(&2Q$wIQ*1$$+EYQg;%gYv0Mb|WhY`9?fFv%di z&m}C{w_>(&9nYZK71rL#E}^rs;6}N^-T>&A;iH*&THs8`XSUUxs}(Oh%Xr27tgvFw zM`iI@N{-(}+qflxUXR5RuKf@~^U|)eHk)Ordg81qop)F=S8VtuQK@4fi9QDV1oS~_ z`%#*YLSs$3C&KETaa%BcMoVn1RBtr6Qhf@!KRsO)4o7V>!}qI=mH;#0LHR;>>N7xJ z+t?N|tLt((Rm~zrPYqp9O+|c4ah{FVLYd=T7uAA0HG+wmVjDYG?zAn7AL8m z)4_)-VKmJluYffMlp zeVji~*VR~XE~3pe>7AlJL$&? z1PF_G>?%Ly!OafKRiH_Sx%k1&cIGs~eVW_Z1!xawDDR#J5@cTsbQ;|^5%lm@pxNA> z=aQWcy2^t#@ya)sm%)6SU6fqR85>v8>7AGepQ(Vm2t{EkB+rthkqt6IYVmF>sY}y& za}uQjcMmVCU)!j3f2nfE{>5G5GzBco1{X%AcCAV%yNB$`rtZh=M1z7pt|{Dw>i)EP zjf3;7@gN|#vjeJ~%bqp&JZ`z-$v^kQ*?33d0E`vs$`Sl_q@Id4=4NZ$ktIp5e@uK| z$AM~=4Kpe!T@yZV&h*Bq;OgbutHOz3IbZ{^F>R_wMAYWyX4spbdU3NxK%j&;BV)9S zRQYs1N0{7WM4WiKs=kYRBLhb#+FOQt|A7SRj{L$}iYtUl0nX0R^WTxh> zH>+kRhoLr$%087yFXcj5z!0ZcCmS4b3;j5J1AW*pfI#+O68TfXMjFJ-ru2ob zPk;c1=_P(kup5TyW;bb%^x@H->8^=uecy#eCCC8=6vs!FSoKw26EK=)EQ!A@kBs{x z5tmn>h=ff5#YO0a=tO8DZNX&B!;NyXMNK4FA%cKvJDJJfM-{xOo5D2T$2ODoM?6Ou zBS4$s=9P`eKpPS&FB)BRJEA`d=_ff@cR7V*H#NVwKqcm&56fDl4;4CQcR81>K>o*@ zB8q!Ax*X&-JifFr3)9OC&WaD4yKFa(hHQ5w8~t_)9=!mrW}pud4RT-d8qBZKU;}nz zpZtJ_^5Rx6dP{%}(OW;7E37B&;K>|mi0!FSJYFt7%#!KrY|)=7I=~>SizwZABHMT( zIs~rJ|0AQM_&WhGpNdI)%1L{7b0!hT5QT^}RaQr135Ig1KlnYFv;9H)A(?K7;!PKA z+KGov?z0Ahgc30nlOsn4h)v_X^KSl^5>-q(J`S`EK2S%}{*-_A z=Ek_y+`U(8I8Fh&IifSfiUlUDwy%+YeCpWFMzn{;eTO)q1U6GmORs$9p*b}4vfja;O0Juv8Glay5 z>@*Uxd}Nb*vnl)?m1DUP%%N7$02$PctSnk{E)0h9O|N|9HUYX^872U9qV`M_{x8Bx zctOfZ!hxwW?!)?Cuvn9oIQwVOe^ z-oB%rwv*-Z_U!qkE5(KKyI|F;*dSK<~gg|YBzT-#RFI1fXX$dH0 zmPy$$RtSkdvRcY`Ed27yblkR$9tgs=;`r=~YWo z;_gG6Lfn?xU&%cjbgADRI^OqJ{uZ%CWj661nIUIRgh}t3^lCk_=3z3MF_llIL|VBThMu}sYA}M7@TqTTGEs&oMBTc%h|s> z!LCQqCqD|iXj;K{Ol2u9*4hCm&7buGiOx&q@=b#so>wH;a1waQPCHwj-2JwO^0`9M z&D|0DJ6*L9=%DDm(%j%Vod~M2AIn8#dSs0c%X|3J8&f4Z{LNDl%`{_j*A~`BvzQ9hOuOFVY%9N2fe#%5r^v3J9-*q`PTPHB@VVDS~ zr3S6&X{VLqIgu0S1`^3(MAmytgJ}`c zMoalsHGy{%)&+=WB|VRUNT@$A$S(~gmIC@c$LrkjSETW#4(5*-klOH3J4S-?RpK?X z<~H;g%v6A1vY{@Ii0P9JNukzhlfU>W{v`bNp7P7ajGx5oV22$x>j}GgU>*Hu5LB6x zSi(BHppBT3V__o*Fps)6zWDl^MYTlE)I)}Ij5L?E`V{|9DkcXr*J}M~;iw^Y#963I zKjDpSZiv1sXg~(S0M?V~h?#3WF)j2;K|@PjQW4=pG^zO|{y5qHgHpamSSg4z)HIG8 zIq;FdCE#l>nJvDh=}N*RtvXi9R%jme!^hpsNxuGd3R*@JPZ;DlzP7Cz#v6-9ngKI4 zEenau+jCep2yGG$P!~eZlwnzP*@EDSMr^Vx>sp$q6>cipWg;P)k8 z#J0g)9!dZ{P~^0Qasju)jjUTF{*eH0`4@Wpz*e?J@fUGkHJA7Qbz}(QKZhB~m4Dhz z@jtA_xU|QHUxS@%PVpDFwivBSbqRKAY9aQblq?HMaS^EtPy~fGAY!6gmBM zGN*|C>w2mgu!-yO=REpG3+)Yl%R#0bl^qT+4JyI_PgBsMcNXpm4850J5P7uA}iOLuK;RRNOu7Spmuj{I{t?v7n8NANgs(rZoX z-N?4UYRQ?)Ec(}9i4pb1wTM(Yd|0tgsG}~c$_hAMD-}%c`(j+X8#}tqW)`QG7;@VZ zg_jl;S{ox|AEX3Ex0=HJ6edU^nNN0fEyxdYtKX~TPpvSkiszmeuVYR137YCU7`BrM z6W*)QqnT6)vCX9Y7khOeSxzJeYtlh6%~Tt?i`*3ch2e7|4JNGSI$%;}OHvXqeUNR% zp8Y}VB;jG2WnZ{#C-&rDxX~W;R#KaQ6yxT(C{L5M_S#iv=(JnSiFs}`X1lh@M)8wb zbrJVkdU~0Uk!%>KJQV^b&%b%N=bqiZNuU#^`#R?wdwgA5+v98&RhRln9*c1M(bqqX zo^5ZHq6iGUwFjAFKcwEP)BG&5%0gX#d{*Z%^mGlmb#|g9H)|w32|F~UWjAYN ziEk0dA!K73L=#3)e{BDv!wl}-s({4RJjTThF<{QVB2R70DR1aEOAjJ0OE+#)x29=U z9(`kZm4!XDHtt}lRpD|ir!D?#MmODMmOuy9?Za+E$?78fKe_k z>>S39oyEAQqRo7(8M`H&Wps{T4wHXM(vnE|voDuG7B_Ju&6-+K!*D**+pyY{Hb+WN znw53MEP6N%7Gr#&3Ve0=_TEzr29nniPK0o}s^p-C?8?< z3>};YD2U=cgviet*xxI386=)9wm>%PG@QrnY3`|P{jbto#{{SLVQBoqi2sz~Xbgnk zniFPk;_Wxg%}3iYn0w8Xc-gI7=hLE!9;=zM)CTM#4>ptuoV-p2LiXzU4LSbNv(MR) zu&48LNcUhoel?nvk^`M;1A(n~nkk_M$aG8lC8Kg-Sj+_hB)w#r;i=`rqD9|XU zF67(w_z~k~%vTYd#?5xtD))DvV;jDmwAku&_b$~Z%ph=^CxbDtfqgP?Oq9xNiDQjV z3AgTuU+PsBa_7)66}C)IR*)zB;xkvqBRGoxCh~nGl(D((WR|NsD~ED0YtNkjEs*{S z?YStETWsGTVE%ba!GIFmq}8xou?M0O+lrzlIV_q9HBO)0Qf^HSW^?f-JW{iVrcq*2 zP$0yJLTweVpL&kQNg?UdH@C8f2!?~b2XirK2Q5~+jHxI!`wpgVf@LP{z^LfIFlDTR z>zaA)R_Rt%l?^L{B9b|v{pWRkjtV)2T2m!Lnf8edlDIEZCL_HxApwVd_G6`)O&4eM ztY*%oz%TcQ)~TPJIe4t_OAmD>A=}}COBQ{AXDi8~7m*tIo1TWPK7yi6yfvyh6BULH zNW7cv`R_EaNEQ#7i(MLCd>s{$pAmojqjz|}A8?=&sm66uU_5hQhA(Zu>Xb`G?S|~U zNtNWm`^47;I9{wK2p#_B46+W%TUm8B=;6kNd;YmotRqb%^=WBqc%XKj*BwE0{L8lU z+ubJmM|Wg&$ycH~u}Pgu*iPPcL-?qsM-%}AGuOd|%%N*u9O>8M_LkISEEdT|)nrBC z(DX>t;)+Ox=gw3i#|fdSal12hgcxwPJvl8Zh-tbubAcC@ zRO9tk1UEGtn?LIJ2Rklt``xOo5z3b;9R+b(li@;>T9MN8u1ZBD%q09&GS!FciCU93AY$Sn1)3l`PZQ{?bUPQEY~3C(COW1)NsTE9N3PT zbh?r^h2?@KW(t+2_UOI&TMc9yGf+j|L06EQV}5__Vp}OqP?%-;UY#s{SIg_h@PTBWAI7-NjR9InieAK+ghnArVae-o>yX z@^FJlhf<7X1?PM2WLWI^-XJjn_2BHK`4eez^z+aoCP&!cpgu*P0=>5XsBeH|0ge z8=Sd+;%XRjr3eE!I>BHIIEk(9+0g@o?P3+qJ9Cg29k3;d1(2I432wW}&si^1H3Yst)RKXc7 z+SK1&--4!GFXy(9^LV8E;b8seP9hhqoiISo0sPnw?7!^niAuFEug?Xm+1vA}=hB0s zSS4D9^-t(Kn&-nS!Tz$kd2DXB0r8sEGSn~Y7yw+i7k8p0hz*cI0i!Ea|X#$dDXY31eJG_Nkor9G~p{=1?(*nz}F!5vIvfvKp@@X?C*l+_Gs^lL8<3 zHCRY{!Dk4Q7wo%XAHVHBiyag)sT*Lt>Qo_pjp_69W+YkVXqg593;N4SS@DW+rS1zn zrfQTpt!0UYi{e4q5Cxo10*7zptzq&nYz{<@ZcqR8R`T(3#tOMR#Ue{;afv?MJguts zmu3=9LiTad6?QhW<{ z+kO-$bA=($wDRlo1MMH&VnQ;n==%1gar8(;H-AZEE8F9(@LlHd1I-sbIfVBm_&pc? zwM3J7zaxESFMQ9x|ZK*bKLj#iE(?JOH&v5FloZ(^(qZ3FY}3>YNAAdL)6gvnvZ z2|_lS(@nk1vT|B=W#@?#4%fu^@KEY59F^qyRum^_5VL8ix;`z~pAyQS19Pi)5#V(7 z7t&lZPYXl5T{YFOr}A-_NyPI_-t_PioSLK(_+Z>zg#3jG#(^yv#GQ9qSd)vJ>|Um`^NpVJfU1l~RY*L&R*z zxb0;$?P~R#64Pee!0$|h-l3;$tIoMCmW7u@2!z;Lsa%v81KL55ZV2V_qBtHzeld=0 z&H8l;w4tqsDSbj>G^bYNtkjTtl+q_aZ7nmAn*AGc&3KozDG58<_`QoC{$t9Yd?YnB zLV6&gO5v(E)d7CbgnO?Z?5(v-tF8dL(hrWzd!z}Z(Lnr07;K&oMJx&8?wAAO$!MDx zpviEQ;;_veQOp>h$IPWz1+{w4duK102$X3^squ$DGaqB#!XJR0kdX&rmMKeO4}U1rtq4p_n#Z>=o!V$GV@ zIlP=qWDwaNWWE9rU^PD6#(r^vIm z*_Mp`B8yC|?Fc(#@?&V)xNDJWG>dkWN;JAcifvnHzp~_~=vp7|Wg1G;CUsxCHj`s< z)I{S#0pR1g$L7d15!a7_U728GNsIOjUW@@;*f|K8FeWvpq!D*~b+2A8kNq7G1hl4y zvB73>w)WKFit6ZpCTq)Fg5e&Zjx1>oE7Jp`A{p_Rlav0MF1JMuAWM1Ra^A6$n@gX71wtuJ~(0*CiO-(fBK>eaQJ z{IuhhyHM0hvCceiEK{`ZYXOCatgh^mpOwzARgv8LL|TwLwbHfc8xfDP-Ap5r$zjX>JzHLP|_AZZ~$=c-S0_Cwr5m++UsEz`Qi zB_|AR7Z16fgU^XQAD(0=N&C}l0L2LoYR{3W{~r{;z>U~pQW1!C5R20`NdX^sFNA_+`O;9 zwy8U5G@>wm>R@_pGz+@i`zs}ZnB|c$fdxU#&xo!7u_s7r5$*wX)jE|+6bpU71%__y z^8}xbnAo&v0DE?@{W)4hi^ETQEeQXqq>7043QmPkMpG`P?`k^qH+4h^LGNMRh8rEY zQ}A=OW>t{?CFB&@S|k<&AtUBd)V30T4oVw#6AmR6DwIj3sg|47M-~XcAffLha+4 zEx1VB^H~{sen6TQqkSsjY(2vWhE2d0y3g<#R*1p(hH^`Eq6Rae^a~svTO+v>$p|`Y z3SaCIa2^tGrt@PC!yTw2C#22!Amr-R8LV-1%5%dp(uRxQt}&mdE znB5|`2eO%tBRH=A><$>vIaK9;IhZ}EM69-znx0zOP;Y>oq^8r0d4nC;^ycvc(KoHJ zpq4Yme9rmv53Wk1*6R+ZLF$jLGTJC^=H*6&?W2vrl)aSp&95-4e+#w!Xrmk|zls>w zDYyd9jhT$%F1+ki#M1+@#0@7z>c$D`z)}UFp`v?s%U0A%XS4gSQiL~@tT<9@ABl#l zoR6`zUWNBHdhSh-A!)zhRq_+A6h9cfSSLA6=80#tRr^K*sB@u3mJ8}p2IYUZI$rxYn}+f9AG6HOkrjD@N%_Aaa1 zvPI8B;lOZnT+`MTgC`qM{cX$Z@WT}cYL+gA=K2%q4%XbUf1MG-*J!;&?}f_rY#eAB zD;qS}Zlb#g5JP)2Nb_aib=2G%;Gz_QJQO z<>zsW3iBw3%#+z-6812%e@+`U0va=g^-wGLF=!{1BSr;jarj;O!=``P3lC&bTn2DP z!NwNZh0f2^nh()9(H^|JeEspjaSwZxWs}Bn6#?4n_91uI;`fhLrjlhv=z|rxa~-4` z_E>*^9t?ExRn(ZAfn@MWhn349@)Bnx&5s)N-zso<;;m>)vVlCpYBW(iYgYk@Eb9%< zq?=%IT{|4;g!HI+XS4r2njL;E1ZQXX+q52VV!4>qrHixgX9dwBxxacLo|nwSjTPZ3 zB6cEAR&ghw zm|~A$M9edc-t(Bh?iKG_a7Yc>{g@sl_(i7cs1QIzPu?2S zzC+VYl)ytlvg3hLsuQNo(}%sW>~_>;=?a}5W~i}Sj;dTO*NXPIyKj0ycP-u17B<2< z$WMkXHuE=@!t}Rb^1i+Y_86@Rq@trQWHIzqAFb6=D2d{edfIcZx(=^AKvh%H$(*Mj zHe00T^O@Aw7Ekvc>P%!B$URi5t;qDKBMOCq#5dV++ITxd)FW zs9@|F_!6{RO+l|@6emPMcj>3S^v50ATYz#~K9MJ|oZdj~VRQWgSlIR@@<8TPuvnK) zh;I%rasAn)Y&Fj%gTpcVK7I&H@0F-Pw6dt;vW63SK{&Xm>rwNY>j z8S}lm9COL`u=KUiGXS@sX#}MWe5pMqBr&q>rvqP=2IPEkEcCy=&Dtux2yjY!^U_uA zFVf}6EGNcX2Ap4`i1}Oa>#b9UIB6)ha^f2aU_>1ui>)^yhmiHPwa!S+4t8+q5yYCP|0wGD1z5gOfD{o6OuMlV|c4sDBz$lr!h+pZnr#vqVzFO?x2F2Im^seHeo z+y|is2_+biV~ZeyV%vm3W3~4cYQi{rUO`mrynSmSWADG1QP=j|W+@9L>AVfEBIt%= zi98z2nFUhH9L@NY;-d^?o-X$o+^E%W|0^sW%!+BIQtASQ$fQJj^8W82<%$0OT4mN1 zA@iU+omE?v2z1`wKcYdLFjgu~(yO+Rn#-ae*3~GU;9WcVnUfYJ)0(qix`E>9GR8o- zg2d!#OLjJ$Fu8Ykzr>Y3W(;9wp*Gg5>oIOweckD3>v4__q5hydmsQ{RBRDp|%5X&- z8Ko~F=(pE1=VBz)=thS=n`9708{?7Xs}kDZcyqL$MM7X%XnOoX>T4~NJt>FW!H9&7 z*WEX8MNJ%ewF5F(a7+*q^qm?&D2a)+8t|y;u8tBd+~fuBq7p~YND59Su${vqk*_+J zrr(nr@2YGnL8NUCN6}aq;8SdPLby#qxnI=pd-`%!-6~f$sxCvsyCA8ir^0{M{PEym zjM{y?>71l4@|YNH4T?ccLLU;mdE?>Ni#JKUc^J=Vw($FOgqLg-ZfX^QazE-&CSIim zdYa_!{6$*6V0BUT+>3gR<#Ju9QZ2gbk{qU~ka6j?&q zAmwwL>7Naz2VHa7@66KAgJC zC>%%;^d~OACFzZ#7_5ZdEEJ>!W#gAW(45G2QiFYnH|i@s?q(>gU`9y;1DX=!_Dt!u z-FLx~og^E3q>ebebtuEh`^|7uqV|+_dezzPx*YBIAnh^bWw}8*DHSGEvF`!Od<^Ka zxQ8l*bmIZ`tz(+(qW~NTyargx!*T29MfwpQfE{=I0|!^{PYRsV0)<7{qZIbXT-t#I zVMIK`f%7j-jP;-GZ&vCk5m%Ww*jq7%H30uzhECXhOPGz%RDqToKMh1?_aOYWy{RAYFd#gW z3-k&^OZ8LO-Tfef`BLKH#BMjB54yr)v#3OKdH1QpnFmVyJ4+r?+0@E9BBd+r*(Q7KlsGMbH6Ii{i-4U+}K`tHZmt10mbC zMZfjP^O=^!-{1U_OM+2RI=(`Ss0P5z{>to*7$ z^p)5MZe-s}Xtq{-T&~?txWyZDF(TazDa;G()dZ4&yPXu{9i6T%jKm1h5 zpT<-(+m*WpdDKOp8o7AhCFM|8nv`fXY+OEGVUgalAIj>_N^T>o0v=s8l8q5At=+hL z;RS4f=E%1Mwi;Ty0XlV{pu$P~r2!{Cq5`R@oi2}ItD~6Ig^{(9bHH731Z#9TOg*s$ zx|s&_!R%+@&jLKeFdhL__iwGUY>Cmeba9#KElWBYmqY#fJUmWlB143!%S6t#Hw6&% zxLr=zQ8--L%5@dt7JgET=k~=yKC3hac16`J^5_As=!VkYTd7G3gUq(w45z98@9;L) zaNAU9(Jr(uH&M-Fn@IQh!2UXKzQ`OjPYcGX;`6q>0276)jPS~l=WP5Ug?t@q16rC| zG@a|E4~0u>MW;J)8Q;gd(z-h$v0b0guh-i^im1MYh5F8p`|ZlftfFvY2J(ZW93J## zkeo@t2+d$2!E$>B8*7K=&Ox|OmTLk+ykd28u@wVY$iFm*; z5V>`=<_F*jr(FU-yIpCSb_Ud<20as5q(x%U%z_nd#crOUg@mD>E5lb2Y0n`j&AcW} zZ@~S%wd;bXFdeM^>Q9R1PKX8@EU=j{&(c+qZHbkTMo4pUOw&ni{0WyPNp+6_7BT9p zGa;^OU3%^3Dup}!)B8Bsf)rTLQw(aQq(HzXB;aa04*2Q;kMoWn<`?{6lDG{xBED^w zwO`2OB$@#^MNSb7fm*9gFosii>JxH|OS+vrh1n7Fw3b#R5sLyXXi?oCwH;9mSCm5% z;cG7Memq;&+iqZ90uBlF$%b=`}XBv5Gd=SHA2Ib za*Ko!;iAz8TDlur{@^>}`gL|r4reKnoROBqYqssbOCQ%`8wKkikGQgAVji$f{@ z6E3~ucVMl%WHr~Ca38OU(KMkYmnWnP`ivUNU*eaN@TF7yC+?UHE|;%Z!XK3%fo6I% zhOnjnrG?D1dy|IKpz`wEGB?xd*m@W!c=Dv2OW*qafd-M#|I3qdA!i6e9DqmWqD4Vs z_a1d0;uJNM$mF&~LSR;iuZjs=zKfi}D%q^6*&SELnj&Yo%mg{3Q`Ss`4iMjrxQU&f zhYkMmHQQNqdw-+1k%6f_=Vbl!u$X&f-%dyNHk5~IQT~fzE@di01!O4e?G* z7wL~$6;*$zzs_@1i|@bG1Rkl;%F<8Zb)fx(Lo%-p17a2?6IDB=I7D4un>&3CyMF+C z8upG$L}`6-nm^*i=JpIw^VE^KE)U6-0%wwuUMk&ejjK)2PCsN5PFDtje_-_yukm+b zPqMd?Iet%D(>?B*y-rDUQpQg(_W}koFT1Hid&Zc1X^G-mo7Kvl$MqhTB5}`gF51_eJzYh{dtGl29gQ)z$Xi;{9;f+$&_--O+uP6 z*OomJ@Kf)POld6U6C0QExOE|MZyRRBjXsLxmSP)+`oLOG)_ZPOQ{|UYQttF*4sSW6 z3+AWD)(T-kZ(9 z;u*@2vM2C{gHcw#=mi4=SRzCBL7)Mz?-T{{6lDoAv@@P`$YUjXX+j56*4t z>M;iM{oQ?JuW9y(<6=qYM~Wfbqw4qeH@5+$-C{>YtXK}eeqSAp!|P)+HICOuD!+0C z+MhhlRDN7!_?Tim-+R-4&-c@JOiWeNRaR#O&sUXGpA~8^9=&CnNp%x%S6*hlxa~ff zZ8mLIw%fD+DdU&`cO_EGnDfU=44M5|HjYR-XL(bmC@gV;767$XTh6}D%!ZokkLG_I z)!^^AlF3o}GTX)so~dkUAJw8qDCQdbfLe6eFSc=HwLex5Yi|#l3H)sYKjVtMR0caZ>D9u z+F9*-<8kp&h)=<|wPjrGutc4KsrE4pSm zwPW{#2f5|rP}DedpcmuNKLSwa@AdQ>YYh(}jYBhL2=#iyzpdM{@cOfN8s<|yN%jF&Na zvA?kkx3AkCh+Vgug1t$v&QzfV3wpa+9&pDecD`GNPs^y%;%K^OU=qp>Yvgl^hrONPvsMtb%F+J zu%d#}r;B!ShGW?M4|IB++?<`*mdzRHv^s53PO7G&F3>*4K{-j<4Srmv0LU`1|_$-M)T0cQm4E+nkwLrj=dU zTzp=F+?L&0i2f&OVrK1sjSKxo&-wZLqxgL?{kPqA7Dq4sXZ`=Y)%2$TPUQSgk~6B! zk{pwg@(&5n2jI{(CY^V z=2Nkod?I5?Z4 z)s`L$IhB^CHH7Uf9E)r!@KkFm(VHf^oYU}NZR zxf4;k36RJ~lo1*Gv9i^VvW|_%K%bgT(-6UORF6fR8h)xFli{q6MLsq1R70Y5PM+n0 zt?><3);YK+p3!ohL4I%HZcG}BY)foQ>^iRxt(u6kV#*&T)`9t4AuKs=0Ub&*StM2SH zFg=$JcOZSs7$-HbP3@h76R&=UKTu%#K@ceR(9;1iJWxXmRkPLEB6+FnN;RBRKRp@E zJcdujC!XNz004WjrlZYI;G!IJ8%nn|5haHt?r$X!z(~Fazo3&&$sz;ibtKtyW(4Np zwPjT>DL-jkN6W^_Orzj=gO6>tpR}M;4jaRph7}C-O z9zbsg{xEUb{XWCOg`rxp_DX7mcvw{Ls7pv8*!z?qFYZFaSKpttXz!Q6_oq`qSu0(*0#x8xU9jIql z7#QoIX)&fYwaDGfI-gH_cfWJg>deft5o2G^nx!|aQE@$G{<9z_oDp$! zOuKrrhbeb87ksi|?7|SWXStwD8lL#Rg5PV(qipx969P@zm+qx`YL_{De)xK~pUy9d zcy~koctfSYs;tO`aEsD(2cIp_mvL7{K5km#CF`BUPy4|1v&1W&;mGH^zx42DmI=33 zvkc=Z1e6_+*~%rD%VNIXzeo|Ogc&F>+i)5v%G;s6?xS_eJIdGix!}1n+l#ZeLw=;= zM0`QVD$kYTTseo{`EkuWoi@(zU2 zb@WR$4Bfne(`J2*4D5cJuo??1Qg&7l3k4d&qdiSMtYc_V-lE7l# z)l!6?W@l^KtgkV5PRAS@hd$kBsr0-yW9Jl4(a9x1GC(Xonmni!fEEyikMtE7{l#6!&>AG*8R6n|A)_HFV0kCDaBF(o#dd41)MP znC)WzB{WxN6UxC5V7hE>{I{3>*>6f|`*>ILY^G;};QpGHvNok>$aKSfoTb_##r;3@ zi+3GZ^QO+SYSCRSb4t+8ysvLC|NQ(lEBR!S*?SDI0`1NsKj3xMT4Lw$rs+vep~8z3 zaEZ8v;dWZYQgtk}Z57(Qjk^;75T?i1DwDAWy!aX?aF(vdcI$!G{bNIH6`ht*GJZV> z8xHvJVipZ=n8%lC_p*bBupFME20pOZR#?L`T5ez2gO9WX4}zB;y$rkkdNU#)yasjx zhMXABg4kx$2b2t3WQi}>f7;l)p-2GC8ys&iPZNXSQvCtA`$or(p$m6kmZ3>dMU9Xt z_wW1-R*)C|AXp3jEoPB>g**IlevlznOGdK1o%=HVMI8uHUDIwkdnKUBU6MkBaVyo} zl~}4&hTYZtgKcejB?vCfOJ~A#)fQ{y+g4UfN@?87#Ds)$ z=3!5`F0RnKui0!x)LAVC=ZLd(E6mb#1;Ev;1+LN9>|V_!qRY#D>Dr>x)M|}Bzx+l% zM}s|g0p6qWeQd}ki}7?NaWOgo;DVo9S2oNO87|-4(*};4Ugxl;-UzC9>)?Ei+E5N^ zx0VHhHG{fIi+$pgqic9yC6k2fJChJ&cS>qh0q#j$?6YQ!1%BxcKrl>CeNv?cDGdQb zGk81>M6?uHVg8IZXPQrI$i_kJ;17=R^Fw!$gVp~Vg}~3x)ha2CW!I=;R&jcKY}S@e z2Y%5ylR`GN;3LQX+ZY9@PtRu!rPfeViUx8eaHHLsXWMlyxTu{Fk@l6*PHuH z!PZ(X-8z+x$|==LZJxgqu;TBwC}`dx@~uO4d3@bcBfOC(n}kByZ)Q^PL0-mY>-c!C zabBqAd|>ox_GF#41!tmlO=}P^mofrogU5X-e8U+7qYGd!xY@|s;JF);I7*J_(9ilj zp<=L6CNQ9MpD5~=?7_TLGBT6eU;Beci6v*hZ1Cbd81IsvCG@>)@QkKn&T(`>w9$y$ z#@H-nL|Nj}29GshW9%KH%$D?Xq%ADfVj_H~S-W&kCD#7TZ>MD}tBq*Ym~-5RE+z=+ zT8O+0f{^GxKO63IV7JEXW(m;?5SEXIC?S?c!#y1(5Z(zIp5tkd4gY}*u*JkHS+aPo zwH1p?qo^9&t@*UMv}JBLQQ@h@3ld{j=QWYYZ2sSE6u~qu&7QG7gxjdLex!{`&gcQk@2OoFf=wdE&BK1YZbx-53A{4C7*OmSS0$6WBjtcc}xaV$>@(q2e|?pm|qOg7=_J7TD) z^kGCwXX7GCUoM~bM+Wk|LYDq5Q-X+kvQuIo;7qnOM8U3-wZsCtEI4=zX`|cIKp!az0!ixuff^&61oUh(+{NuRzIpjp!tkI z;&T^M8>Y~woXtRc$8(>Qd^(usD@@=b4pUU&tjr8P200%g=O%bWqIlwNoZrWa)&v5T zo~}9_D@<;J4}x}7h&>mb@PG)llsQOJ5+uw7&Wgq+*wSfh@!E^<>l#|?p@b`BFlh7w zf;wHQM=)IC%is?oE+LHq;t)gr-Y6EtQ6?fgwOHQ zT6!FsjbFzopK_tk4BzAsb1gyyaMR7=77N7#7^^rF6YS~JYl-cJReNc?_v2+rUrsG< zslqHN(LP!Y4>|=;urw|JAL~W;6NhoSG`sqk>Q13s;>6Tz_a;LN=RK_9( zLhMoVQdm&c;gk`Y8rF9zjM{* z<%_LD{u=%ttlv|&WG8;X^(}}+C>Mg=D-~Q**E#g}Fg|^N=D4{qsn4H+_Q!F98b$4< zVvw_2%VDS=3mt`luS3^DZDOW|82po${tdIy&{@K5I8(*;fv@J>OyzB~*oKOa$wA*H zq!z8l-UHsOiQ1I|j;DBzL4hN7D1)!kr6yiBngkrQcPnYB9WNUV3Mt0Ryo_y#0?o(h z0?xykZrW(^0|#VpF0gBM%0y~RQPK)-p`WI%^h;UKmtm*iqV8(E4I*c`5M^{$wIq!Nxh*(Z#h2DQo6=Pz~$hamBD3EN&<;T280@ z99j?KkhB8GeZP$)v+f2^cg-5T0JVF(z_6RF4uw4)#zD?y3ZlJLm=IWr9!J zu-+~L=+DLb)|$)BRZE~_-oh#N!10c??R@n_K&+-!&DyTI#I+KzK0MfkWslGhL~gFx%2>NWrIsw2w<|_W=`T>o+s%o z$_X#U8kp1}nY*&XT5o8czbjnOx*=DI^``XgHp}64eJyk23@5IUGvk5i482gX-cA|C zrXP#8&0=h#E|m&;$UHVV=vU8$PI?QEjP>%exR<4RsclPB5GV*)^s9;qY6W==NoW}| zwNAnEF+70h!Oab5)>|+lP^irh8=JqmoTdFO6fj>$TZh(CIuTqw^K&)$qHJY%@IzSo zN*L0v)QT}}cTAJEO*Zl%)*Ix8k4>)3s-zPh?-(?@?inzKO!SaXeqQeJ)w~Dhs%n=(hP1fNjD`n`F|-+6CF7YLnckux3MtIJ**iu2$Kl>BB8cdFwW) zkoT#&Mv!R&Os?D0*Ji>fWEaiHuM3{5D45aT+;z9YDQon)i}B^S9@Tt`UL>qt84Ma@ zjcy~?kF2-0ZloSjIV-^zSBEKPO<@{-Hv%>6@3PPf9MIv#ooT?lqgJ!t@UqV|pk|~p z?A_~9i+tdKOt_dG_)i#APOfQ$K_eS@-K{41@2NMoFJ&6GmgO_Xb8Em9OQG!tesB9c z9`aVGtDG@%`g1vy`ls8~dY0N#O^33vEFW zu%}H)7xk*dv7N05Y=2}ZU|$>Cd2~Zx1^+q^oBEpm^XqJ(nIETHj`Z0eH(K3xLy}?E z-hX5g*s&87yZPn5bPK;@b8C}scRxaMp?!-$P)tf$(l)I#J(-ft8EemH5%*hhhrH7# zF2l#bF&SgU8f+GqS`pr220TCNHt$1(hXJ+Su*3xWt4K(qkj6ml2ZMJL3W5keSL|^i zTF+~Y_BKdF$&4ulb^~Mw(RvlM3VD)+F1R(Juhk`EfsleTsk{i3rQnN5gyNd!G zQ?j=)IgIvQ(a+dWlG?IcS~}U1QjHs2;kz9w(ax2+)~(Gh8Ma)8+h`=s8fEpvnZ=x} zYTU&4?qYJ__AazUyWJ)GjJA&^^M}b~-!`&sK6x|oonm$y9=~j1kKR@Vkr{P64Ed83 z-?Sq(CFY)5$nC!zA+=Cf1^n*0VTI4ZUbCbs@bq!0Hqq6`cc9>-1XNHe;5CX57ut3TdIjeNj|C&FTxr#? zDAHB+PF}vW8w9$crrzV(-U!T4p877mIlcpvB`&Dve#QXsc%T%wJIB3^K7PE4wjucK znSus+u@?Eg%8+dt!{U%wCm?6UmAa@vH2rfPlg78}t-D@S?Y)-`i$mg9<9M#9t3*Xb zV#j21d8NY8>c8}c3uhmQr5EbldoMIB4vA3+;K1kv0fonij$TJ4vP-sm?{)C|x+_++ ziCij=V_?VTvv+kx+E?UAC-WFDnXyXbQYplJ7SyoOfeSP^#`}I3^p2w;sJLx6Lx~P* z+W+{o9K&0^cM^z1yzctjpyG8`m58YKu1qJWNL6s(7s`D zNc>HqeOxwI{o~@Ya)X8@z?@`LF~x=Qam7z36B&c+f3Pv-(W&DI2FCSrxm+t4mzpAR z#m^;E>o~S-Q9x4bJD;)h=_1F|5*}>bTlQAHMbB^KD-s#_*`W6>!4Vl_E8c=pzO8r5 z?OW@XsyfTakVdA{D{C*^>RLI>gyO+(TdO<8j7A!cXE`PwnaeCKSnJhtf6pb8?1q@p zN^8Y?NB6YU-uqrE!5{+2<#1svi<3jGo|R|ec-C#Cq9SD3Sv8E#^c-en8snqai=rB2 z$ysr7xwOiHi<)D~=h8|Y%d=jiEH`UqiqDE!D%S7EkN;IPPtQt;PRU~@Ix&|{v15#^ zjvjX)y|8jD9P7riYphwe6W1_fvU(=1uwbkg%Z;&Cl&|Qwzy#C|mWq|8IabeS;N8A$ zRk=hql}D!ztX`w&A0kbhl}8ptnJKx9nMbFRD<{TPa-XU*MuV4M_;rn9UN>>gQ=&>t ziJeS2%x@f@G2@=IKDeFD2N%V2Wnb0FqYh+u8kfneE4rh7M)$7deig4dk{Qjo;JkNq z@9K4X@95Qvq|(qc8Zu)pZ8VieW--0$Igaw7_&vdP9&d;(y^dqc7IptI{Z8z^Wpa6S zqkFXXP-TOw3UKD**s?`OJJDGMS8P>|Wt7hfwt9Q-sJphRsnrk<)5V-dtFYr&u|>~2 z3RXsjWaeF9P8-K0`oln;qWU3qqdDES4=20s;Z)N+oah}+!}-i~-KaG2r<0)fLGI{|@iz61hY7r$*YD!Wcj)$|Q1dX6A! zmXT0$T=o>hWI_0~;qq}P|2~3sTlr}g5MZXuiF5WyB42T)hnpNaLUscK;QFsoyu_+RQTOu>b6-( z*>zV`O|O8WXBAJg%oUX5EvFdP0>W?BD)qWpRPIWgTGcBl)ha4ahfri2m!qJqT7ypCjvp&v@FkZ+P!z8iY) zStylDwK5_7KHB?l(6Bfpih!PJ+wd_$(cZn>`55^RONY+1;bY{xh=8K#8#gQtiKv=x z$q|X5Qic92iS@x?u(f;fr*&KMY?D|VZHNn!gnD{%j*3(Hkra*-ZOG~YLvlkY*PA#? zK!E^21jPe|_896@c4XLjRwC4MFIBOD>dNs4G$245=YrZ2bXeFAJ)Br700f11TGT=~ z1r$tS4H+7NF6{y#j25Q8?X@)|JMxSuWP5-T*UB=GD|<%R7e6mlA5Eav7Ww*gY(TLhDl}zB zhV01(Eg@u%H-?>qLXbiBWP>I+Q3@5p@jYyu3lg@&uBtdSw9wmbxq-v_@zVkOtD+Qg zvA|N@H7-uBow6gt#vOHF8-HR8mlgvIGVtj82{NE?r*f!Cq!8UvFiER64AVSJD92@*F|Y<)OXvGw6F*EAI> zRa)0hqeV_rCWqDw% z%JRUNr+5fGzjNHiZ?xZi*yZWH_xiSJyKYAqfrJ)DKQY&|OwWYoc7zc~Xkqjdgk+Yc zrL^g+q>2NoHNts_o){kE(}z`4E7GoY7nXz*FjZr=IE8bHb%Y49baYr+HMJsDgvvbG zWZoE|*Hb8B1P%@g2KGq_EC{(sYDL((?&2vFG1B(OA z9kDT-P|sJyk<-H2u%~T}tb*J*t^$spNBdoa6CLlvE{~1h71ofn$v+m;v_-!Exo3~1{#-sh-8bSNwlRSKRA9i`_+xAr!nDI0+(7>bp-X2o^e2|Bk z_hFZZwrd~!0>+Q=>EqFUZ~MrJz-Ps=@ILJF%r)(?^4j>YJ$yWlKp=PvfRNs*%NcJ( z0fJ1=EdyG%2=n@+h-Vo|t%y*TfwXxpC@rai6mtoHY2Bg+SdLrgpb%I?hDPuu=&-Op zgdZV{7N&L6BlyPfd+&ibd*Q-uk&q#6k*`m9c47p3VGqpu%IGqXHu>iR&m#dPq(C46 zFl;cy5TAok7k9nyJ+E|R&7=L^E}=PUg{*Aehh3gkW!2P*coJ9WJlgM7W41WkybL&a zA9i_EA3+CyyzF66@WIPD2x*(nN_-Cz4tb`aLBe^69)A|J^I|P>5c-|t?0xSE7ig0< zezzOk-h@%wq^WPa?b4gW9=YwI?Yfm^Anc2u&o$k;xxKMWh_YmQZoPQbgxN6D;NgeG4 zq$r-(Z6b+qtNLc;1}=r`M7N{OCvwaPW6tdxztv{g)9cNCtKVqXRgcZ54I4<}EXVNM z`{tT4mo3&e^(`$*CXHXJ5?NNH-};T`_)Qac*mmuL%cWy4&$3%a_FTe<;kSz+lS!lV z$imHCRkzeF@4X|%9Sv?{ta-$NQA+f(Qpb+T7%8SiGGDt!`RwLVc|#0YR*ZW`^T;u5 zcl2m>6f-8{CX(pB?)pT1lJ$bn zp@3>qBEy=FIgn1H5{!8S8%rXeVJJ{EH5nD9C|V?Ye$+eu(^%G2vL~$S1obSr zjC)E~Sn5ZzvE$NQA;;wjN57&Y)Ck6#N3yYFh4{8%6sdyk6gwu5O%zLSuTXCdi$fwF zp2wpptg{?<_?_UcYD!cg$M2tA)95V6@awL_;*dBYHnND(0E((9>L(<%)#;r`spq{< zKvMFu?S#=w!s)PB9MPdxy<@R3LVNE&bt>6s7j+`_$B+O2kNn^xjcC zv+N{O9+^(B9>Zp@nX6`NCHhgOLrk-YG{Z7e%~G?T<3*jwXoLCmLicVf8qMx#zd}N> zTJ&Di^O_vP@0B9u64_)P-4lbl&`_cz*P+^rSUuv7-iLV+2ekLL3jqu+7ZV;mwB_&y z=dU1%V)gXo>_DvyyU-GPA9i`s!)MJ?l#3D+2+Cq$5-vEwa*THa7{gaaxbP319}r%M}P$FpNu z6KSLO{_~SN!Hi}`=2B^ld+%s&SHN$ZMr-;Ck|<9ksm+V<_Qno5z|IW@gG1FS?N?s( z@L3b(q67uRz$9ESGX?L)7~&o#mx~FHjrWEL&#=VLD($@k3sS7MdiQW?_(%z4fVs-> zYIs$n&J|pb1)Az2BqI`XN1u8}Np#dn?r3-VfCCQLFadn|5j;5XvTNo~>}4-w+#oR= z3kZ(r&f6O}iAvWNiZmNtK!kQVm;eWO`4b_rQ!=bICOON|Da>P8+>c>TdddY!t&RHm zc^MXmM5{DOGoc4B`s=@ss2j1NlRLTqieBmc_oerr{H1p^D5G-;cqE5R=&tkBUb80=F!Y}W#s}jN`H5~Te*~Jtrss}+9qKmuzFAIT=-@2pa^8>^8?#RZKll}zwMfqXITas!|&>@H&bP%%wFd= zj?b83VigsNFw zD+;J+VxoBBKGEs7_l^L&rspbSR4X6`$w)|beM)MMnq??Cev08B{5rir)wxW1xhSAv zaY#go4uA$))!utrw8yA-r2ObeA2CpP3V?HI9$}~~xF*zsdS}5!fdYl~!-o&+hYugz z5+zEwCQO)ERaH%ul$25>C8d7A0SCxdR#tSL&nKWHNs|1zxw$W2zR+R9gh}0xA3xlt zrlt%TGT_mmL1Uh0nx?yS>4K+3iISIPS-GjHDJ?C{i4!Mo+_@(81PQWa$&$Ldx;Sy-09vzVjoP6@2fP$1 zQhXXTXz<{{W66>wcXxMc)TjZJmzSq@=+Hrg2ob+Uix$h}vaPLcZf@>Vp+bcV7cO;e zZEb+Cu&_Q17%-SjW{@C3=;-Lom@%_v%^E&FK0t2VxOuItth~IuluBh3y-D|KDpxpN25n>TOLrKP3Sf&~jX za^#qso8!WT3mGzG{@vXj8#Zj})T#6B*s=5Z`1szdt1AT*P@t=;i;j-&j~O$@jT<*| zc)&2W83yeg9Z&7Hf(;IHf?^JHf`$E)YMR*K=HY_xMs|lL4*jAx3@PfTD0Kd;i*xh z=C4_^=I7<*$zfq(-Gc`YTU%QVG|+$(Cr+?n!BSUO2L=onGiJ>EGiT0xG-%NLG-=X& zG-%Mc>$(~l83B6V_tT(3LjnmT_&$92XlrYeB1KA=FkvjPz=D5wclXbnIRmJ!>r_ce ziLFG55`SxJt5__42q1vq#*G`F$z%oz66C9?skyniO_?%~TDpjg{D^{%hDpjh`5h6s$($W$j*L8_R;@{fZ`YTqf z7#kb=W@ctObm$;LgvgR5OTH5)PX625+lK-L%BN}i&&|!@Ih{@p3kRRKmi5Roj7sg>gp;+ zj2L2KVn2ciBKS-u^Yh@r-GmQR9=5k^N*c`IpP(Z#J9%`FzrWVc0$3fCDgKz%WOG1PMJ-Qc~Z0|Fg2P zJ{K3)fAQkQ_ww@kHEPrV^uPlTuvJx6tp*riKv7ZAs-&dkGBGj18Z>BdFI>2=GBGiw zQPiHIr%=`3J%#q6D2k#eN&(4zVkf<`usHH4J=aq6_TD=KH-0CNIgDR&wrZ9{X35oZ zbYEvUmSZ_s?v-=z)yt`Jsa(JD99JHXWnOW2oE=xk(I`I4aj`4E@Qb@bLTT96I5m>F zsN}B`BsGPkGg1Zs2mk;B8GsOl;W!DT&M{`T0TciU94dhDRYWWr1_Xyg7z_pi0*3$q zU;uz&0000OfWgR|s%ZlN0#$z!M%sZWYo_;8t`#neer4qp65S|qGG z__YX&qK|ijiVN)Y3x3S3TMWOWIY`tG#hL7|xqYVUhTu*Y8yg+NY1r}>)wWR zx-57X(jv4N?$o3A2vD=bSQCYgSh9H<0=48;w1B)wiz#bf8>_!W9idRIzNT%{;Tc6( z%&R4$pP_tRK$XWHK6M0Djdp-?R6ttvA=ZmhySLzFOnK|zkW8)+UpMW%xn8uo;ML)60qY42uDU!Uj#$zj4FwvZNwcbE7R z8sFL`&{tEsvNjh#^VejFChh&zF;mza9d{KWEiSTh$Hi_7Y3tlLF`K3>t|vRmaC?y^ zm1v84s3;LCUH15q7MFhx4_8yi5~}iMrz|_(CmBP)a=yJT)4v`b)(f9d+b5?8aRCU3 zT&|liatN@bk&(<%pB>Jh-XCwiL$Zk0(e%pD4Iwfl!d^+)aimo!9acKQECpuhAMv%; zT<#f+Nj=lMeG5C*4Xe3P(NWpm8;6m?blh~US>zM~FvXMXX^J?70aVeYCYw3i$M3G@ zeQy0N#I`oATKdh9G`Q~t30L9;RNwh@=XBIG#A9s{DuJYJ-AOkGE;qmooxHhtx0|tT z_%n1#=$mi%yNJUYLb&7ymWy!8rT?qvkeHE;9b8Xh4+?1}=FBTzk+@eW=a9 zjI#rXXoDUXNznm8J(FJjx^M?8IBZBZC?cz6iK@F95a^@qrF zfH1hRsBoF=ak>15hg}F00$yN#KL8q$_c(mGHl{v!Gnkb zoWv*}kdgko4vA4ERx7 z2jk|VIyAC4_CUg0Oiu`aJyZ{}5ane60cQaOZdU1miG8q+dI0+9pSt;Icue*t^N>S- z$?X#P*`iMCjhbp?<2Gfx4(Q%5df5w>0Q#>dyzW1m9r_czIjnw@V__fkR`<}3p4Mhk z;iv2eceLOMh+N?ze}EUzi7-2?3bEcru~{tyZ7w{&ka9bL3cCM=Wrv9sVo z|C%fUne4&V(GTF{aZ#Nepaki%b?WGbi{7tIN$&vdeQWD_J|oN#@^cP#$}ffZu4mJ zG$O!ahbkWDH#9;~{Wi6RNb?2Eae*CeHBfqs_29pq&ZV07vidm0iDri9ZlbNB=uSm{ z!!0RSmO1S%9SczShhZYihJz0qW@Cc*kvm8V1|a3Fm_64S1ozTI@b z9T5-j4$KjUR{9zL&=8KLu;D27-qb+bNnmQ|py)1Wm7OVaAHs%F1J*ugIBjD+&9Y&K zW71=M#W4Ym!)pk2z;*$)G7*WPT4&~%&Y_p_fT`B3dGRK~F6rP$JVQbUSlp0ksqX@= z5h0?l32IYE1exl+r(LFuMNOrCFmM+zZ1v8X)YJ6oI|5^42d}9k@?+p-Y8==@C2lr6KZJ7b3ABD2UKwb4kzL% zh$@RsyRH+a(-*Ian9SDF0hJ2j4-@|oZI4tPXdKEDptB+`GP?aQY z-_)V+2y6`>a1E+kIs8COO{27x<0eHai{Y%a6p5mL4d0$2lOD3T^e!O3%))wXww%77 z&I#*xhidgNPddKJTX4A)7vNIF(~E1UU|H5iu0oyha{qg`1a{7tc?zHqI+#fN0f?Hw zkzkk-u)Y(z-^adT6Yy%D1laGcBtpUfcQ2wM^&)B^NTn{Wg;Vbx_<7Qedkn z7TIjwsZ6U8`Q1kyDtN&FuGyhlXm>$#3X!a9ppQo#@!l2KJbXhPI_lnTyQP%{w!)U2 z0BD`Bta`6K$!lKKb8gN#`cu>-I}qMvV%vpO&&jl8(ES62_cV8j74 zMB*)uRGT882hgp@nxNo#q5>Y+^7Y#2D;47VR%f zHaK*6T5T;R_bCS6gfT?B*;Eci#0C_ZzI~kqxsvBWi*DA6OZSL%a(;?f`T;P+4yKtm zUW|%x0?t~3p3EomB~QM8caWofa5qj^%Wa#M^Je=U;letp=Zhlu-m4fGO^fD}pTE}f zPScldn=ib?#FcV`GMv^V*1e7C`|r1ocygJ{4zG!@Bd$kd)E8fQ+GvRh6LxzaxkUrz zTJMk2BOZvVz0CQOvv&bQ?nSHBm;AHsq?Y_5w~*DM)6ZmMihj>T=fJF?ak%{9Mi1GC z34F}vvz}vQ3mMbp22tVCy*DyW4?l3e6fv&9-7Adu0MzBmpjTZ>G&(J04-ozCYcmhu zD7}a_+A$)FWM#vixBxyw60u?_*dcANwqp8J()L@=CT!8M`?aw=z;6jhE3^yinm^R^ zT*Kv%YoAkt@WiBT2j99f4;RHau-lIgG-{{Yn51B6oE;!=1;fz~yke{MblAa+a7=`* z;0~NE%iL@QmT$we%NyY?3cV(*94FxRw1ZL>1bvmTm{hVS`{ZcFjXBQn3l|jX zX*3CxQH@nW4I0cb+q1IlJp^s%YA+iwgmKJc{rU2|@#|7TKnJp%Ks3(KCYT*e^Bm%j zz=vf(W{M^gW7xr%g)yFDkr%pGsgO|$!w(f)_|FA*^jQVhHJc6K46bP*_kkPFS#*nr z<2-~jA}6Ol-6liG1OUe5h=PAXNVal!1v!^;Y?ut zu%FXvq_#FVd1rCfPx`!)0Nfhv^%lPvSb5uub7@7yptLxlKipYzz3KL*sW6&uFpUMVLoj$9feBZ z{K?LRI(WCKjBI7I8h|w2s}S=}ogjH~+kVmGO*U5@FP|OLFa1?K8UTIgbLs|AJ%_021w3uK5>HR5%zB!mymSKU3 z87Ey{kDhK`#gOHP|tZi-~etZq2nIYe&YM^~n8=5Cro7qJkiT<7)h^!lIITxDTopv)q$Gs;*x z6?`^%WRoQa4HYX0HQI&c8E9L?w;omjP8;_U)8k)=p%!lAneF{2=ROYmO_8N18BQ&7 zDS#OR+c@|5sa3qFW`)EVjI9IWVJ3o-s<9vNEauaQi8b>lm<2On*YZS*dY^q9xuc+t zG=)AbOpL_RJ`?ei!N;Wlr$AW0vI`~{K}Fvrv{TD&?Rtm&4V!3MusMNU>g0f%!jf_1 z>phF2V@-FgMn7H9OVZo782@BJ1{EuqT4E#Ix_PvzD^`CC@jrRPaQQHp0bbILN;b`F zJns2Ybe0PyLd4KX$1DD$$+EeM2i?HMRyJh`sFWBpkn-BxiS9s8K~W8`BBW;*PiQZe zYhIlVm#j95Sh^h!89VYms)_OeWK=is_f~zG?FEi0y(8~|xb==XkvEy^x}e2NDWTg6pY7(b&!@;rDy2o2A)d^`F%lGSP)x7+{9 zEHXnH!bUOK%Rrnc8%D|0(OG|YSkydOdVWx+Ns~XIkFm~R1mm9GM2vj@4Xc!e9XJw= zt^H{QM_vfB6tfe$b^(o)$lU9%-v@)8*r^mpp)B#$zdL&nYQ1j>7n24CE1fJ|xzRsUN zmommbCL33A7TTZPHBvPA#9S5;AjPvTrSO{kyZdYI!H_TPCKvZ?~g? z=3PsGb~Q}ZF6?fklTrodX0p-#uvkyqvF{!+0_USf5YJO}n^)z0^8A{pln$K=K`R5;}dhpG_|GKZ| zsP5x@a3pZ&G91bZN);-7FU!xdnWBwiPm4AlW-?-FN1u;fe|r6u5zQQP9BzINv9nFH zg3EkTCqjZH`EmI|hS&gO_WpF6u?K%QM@=mqmdaNV%-B)o_jc>7*-&@j8gA%tHBe-h zi>eiO82btdQDCcyK@(=O->%QG#64{`3g81b zp(E`SFe}jnW>xc87`C3Zuo@d_vsEMXzi;*{4{xgS~QgJ5T&)upW2hlEcerV3i-MpNJ`aZ%p zs@1tSAF=0VS$5AAzV7q<-&q^p`(-xZ$;b5E;akkI-6tLn^a8WcutkEF*#Uv3#U=YA zXFiz<091-?FSO02t%^^trl%-aWY1yUxHEj&3%mbrbr!yV;3pL}EFx?4-^6jV8{`%G zn^jW5r{rX@_1!ZIy4+RUf5J}m#qU&|Jzt|HWl^hbb_RK@CZpJ=MDnxot)j<{9&~sg zA#63Dnn?Vl4OVMhd*-OYq26>3WmdFT57^Q{X{c(Dff9B0q{KOJlxpI=J^MI&dlXaIw14?SYT6i>>2|BNGnOx%vVJB}=zC zi>W5N!KEbj;F_7@M@&_cy%GY5m-8lNsnS#q05#4wh11jc*pjpUU3|9SQy1GD^8eIk z59jRwM35Z+ZJtQ=gTnP_g?q!+^#{`rD3MO0X&WXwX2o~%Tp7O!@I`r;`SFc`hAp?_ z%ar3zMtj($HoJ^5IzNna)Ur+anFP-imb107@IEP6+4+^E4Y2#0aB z+j#F}thi~S9J|Y?FwbZukqlhJH86F;3O=L5bh%}~vrTE6xcE}@Ci4LsewSR1c&=pK zkp`8{FcB{%`10z-&#`bVDGZp~1$f|wbCl@p7#t!(>xfC(cWU2Ov zntdX^Y>X*2BKIlmR_t(wqbv-_m{xK^k>69}?y|B?x8B6F35T1}Br@w5Je+(6Ed1*+ zC9#73xf{)8NKAJD{-u!N+7*Qh!v^1&1!8W;Nc%mq|61gQ?u{C9XWFi48VkgU1^b$h zR^n&N64g;W{6=mI{4~!xLtmj5u8X)bT^pWG{iDHDA7^~ zk70PvF+b6wa)*uylF8sKi~?W5#8X{6RK5*_DAPh^?M`834>_Hq_kzkgJdYO`VC`x( zr^Nj>`ZX4`c6rIq-6t-a($SI*3tJ_ZZh(EGeaJ%?&4}IThfYjq*X2;PFyRj_yA&WL z9k!xnu;X!k=eGcojy<&IE1xkHr!#9`7;!a66be*>n0VI@RwbO^GM>V6koc;x?#=J{ zhro|f#x;U3hmmr|skA{I*2#gRl=Ykhl>7M9X4bbSln?_urgHVA1eA=P%uWrqT zx*KcQcdtzhmf8rM;+LOT73)x~i|MlxoHPhjW(Tw9x0V<4&v2LlRLh79i(7N}&`%#m%~fvre+z85u)ly5#$)ZcQF~75)#!h}~0yiiS!H?EJXW*2~g9ws!i!-;kn`e=qAu9DQcdV~vgBOH!Hh82d`s;m%N;Fruw zmm1<8!I10_`slUkxw$e(<5_;JFq3*H_V230!HA<1zuzk0|ke*^qHFoKWHPH9J6c2Pe1gfmK^w0l|Wl+lpX zn~!^M(3O2P%2)0a*uztmoLAU*>&q5HwI<-65x20pnCQ2)*k>P508F|SlDVCvVD>YX zki@R8%SR{Mu)3K@XA5DNBX7v(YTv~Gj5+tkv}VTL4@XQbS*mWKt@j=Mpw^Mfl(@0Lxg_0N^q z(?0qQ+`-8;4AB`74nnl8u}ubk$1-E?%to;)H)`oEeH*S2>S)d^$KHg}OXKl7A$sFL z^&E$gd9!rWrdFF84=zjao3p^r*sn{$-n45zM+93@K7J^d#R#coDSiuib-Bt9-q(+ne+J=zh0S&W|Q z4A9^YX3x}&&j7#_piLbLFmr~HKek2NRF=JR;|kab^q7!hICmseFyMK*L%xGQSbruX zJ_7(|fHsx3NdZ&ZbCDWy6ynw+io&pxh5KSuG@=4Ft=uVutPhS1YX+E3bLeCA1}ASe z#WO@`3{g`Z1(=+{*&SH19TFZwbSCaC681DlK0|kLx&}jZ2H_?e*Pw0nQ}*anFY7vg zUV1hF3?XHzA;5t%Sbc*bngIY)g!a_^BEf7s;Ai3oXK!Z2XGCNcQnnfan0bTIG1wwA z0+I{9twrZ1G0O4K!Yt_Ev9kk6-07ro;24X9qBeQMNn+n7P5onONc(5t)Vb zt>SbK_&ymaqz$BndaSCX5U2@?xxr6aBv7$2qFox+h@r?jZ1N4d` z0A_wTdqyTc14bu-KE)8A!E?YG_uvfP+Bk-`VB2+yFpdHvV=WrhTa1sH6`c`)DMp<- z6maMcW^Z7M%?M}~qE`$JJaQXZa~L>+6fTn|^44wmMAoYI^ydpWZv15!#VoF!wOtZVI$sT?J4v!4Z+W8=JJ}^nx z5eZHSGOgfAVl!ydQaHi&VZKZz)vd7!w6&*o6|O^=?~D(X_8VJPr8~`|)>Hesw-qOg zk#?@(5eF!9JBp6m;Vq(LAeWQygjr6R5Mm&Xcn0YBf-Tf88H4Qx)6^b#Rnuwq0}b67 zL)@q6UL-?$1P0ZdRyBsc8WXH+oEbU!NtU3f>*%o(no{DF0Tb?^iFEdUu0UN;9Jz z62Kr75U+p%5rIOO5J5qRh!c^JBoGn_qz54C7$u3dNQE$m9}g3Vphn#sIO%Q^8s_XM zyADaMa!JgNUz-ct1OI83ce{DK$-Qp&`vADDcO#jreB^l2dmFEp!A5AJZ3AEMy>@b9 z4glhz?jXM)P;I}b%QQPtrfB8>+m;R|)l8$w@uz=RQ4FbbvVkAT#ix=U0^ZxzOxf+F z>$oLHnizK5h>O}bB)u0@#p@*6c`{e&t`>Zn@73rmvTYCc7LH+f57MFq3{v9Sd{>Be z(4m`Cuz$iXLCa=~G-*q@Nd*g6ooLgtk*04nAGW;rfv+C_K`l88Oyr zWrVfkh#GpdzMhJ-C>ce(O(1DRDsohvGs1VtX?Khk6wmdGGV`k^+j(6TWnv2NGpNiU9K0-6q@8%3T3j97M-yU0NN@ISvr?la{vXLB&zFM zmuSpxeyYoQ89YKAQFgoT{%l|H5YpoR%_Cf zGY(>i5mJ$9FbMr`|Jz<#+hp$)co~cq{TH4WHe|ZQ!ck25GfVR-vkQ}E%CJGh1q>KA zV8DQ|u*(p*LK!AzSEG(+GDIkC(5{dhUkMa*j-pHfr<6U(Go zBSWLYP)zLd11oQ}?+Xx2ER*}p*g`XF*nqXqr;MmZT(bfhpVu(Z7OwE}^6C;Z<1-uc z?K4x3WXiZOieS$8w2(&3n!}*^;>Ao0V!HTvQNzVc8ZJL1Xy!CsMllDjF|!Y8#*COQ zK4G|&3FCze?GweQiG@BsV?>#aj87TD$Z+A}rG?kxZD{tbF;j*yFkD`*DPvq>WLDVo zSz(}$cIHMq^SCAs*yS`~#xIQr0)=IU(u}tpm>)kjUygyd8(8|Bk(ID<(#y>T#xvu^ zh6^LcGZSVnVYFzOh2xhVAuwc92F+f4z?=BxwZhG(%ow_`=GoU}F0a$9K;|`!{7Nz} zF?$jE#xGwfKQk=QKHQhTkZHlEiw|fMyL16bG0iJZ$fg$BxV*Z^a9y-$VPob+MvIoA zFib3srv~T)UHD4S443~QzcF9PtY$PrWzc*fGw5RjM=xTuXo-bdw17abE+rY3`9fyq z6Q)aPBSWT!vw`_SriGz2U&we^N?RC&yY#M%P~skOk5?MNq3KDAgt=fJNV;erZAw@JB3)y7a}E7G z1Ok!bw6TO8i+wpTh_s2Z*;fwbT(O%C=Q@WYN0Rh}#J$6Vz8P+O;ikB5lioNKl#649 zCM4cI*rPa&wonNayWPkUtbMSdT&(uNa-UEsRK|i{uMyn5#PX}bKA8ynU_xX$6r+hD zF89@JArLA4T*_{q7yiUz;Fvph!|JB))=<0hOd@Wflf~Ht&PsK<_sD zvCV2=O^jU`@=DOQIEuHBl)-wckhUOO7~Wzw+$$H>zTLi_5a-ceu}N@*+4y-PmMY;- zIdlWZ8xYKj2mXYyAR*8OMh%!To*FP~!f^4xz(8gVnKN8`Jkd7RVxVXfV?Vbb+lVV| zvoL6o2GYdZ7{+Yg721gN!1AZ8-9+yu-b8S;*?>fwH#y2|AvkUmVcr;48Evj@A}NyP zcguaY@zzu2cEw7M?Vc*P9uNp;yQd1!R)FpSx(d*D3t_g9MtaTGn6BT#?KRl#8(aU!kakWXf)jI_07ibH5+X>@)}r@w;-`* z6B1+K6*n(17LukYI>nksVa6verhxUL(@%3mcZRF^h^k|bH4EEK& zQG|K6R}J@54w7Ij?7`9_*5ZV-UtpYVw(oD+$HrBX;?HdI=CTcu-blV^FI)KXY@rZH zlZ_zk<;h&b$VpiEbMsyg(QZ9eL~v8)z?}G|Cnvr<8SOPhi_t`%+h@jAisMjdBa`zY zo_WP$Vi(z7WQVrUjO-Q)?ZOzwW;B2<(v_vW^;8*wz}g3nxY`fwtHo?!NycoTH+~yo zu8^FOj`pQCCD{Q2()>x7tR&}jWLe|XPy}QR{KC(DD;i7 zp&wF|-DF}I^FY}Lx?EOZ-_S?%#_y|nkeWmAxvmufcX)`aJdEpEQMuOk> zed0&L%CHf!E&L@6RlY3A%Pr0(iH}kUnv66C<=X~=e-BoY+p~%EVL3tdO+b2 z5G*W%f^fH)D+srcD~M(bZMgBa2f94)Rs)a4zH!?(&W?d0?ghsFCVH-$=b};tjE!O~ zO9}h1z`~n2mLeJ2M(`HSY~UVA(g2dLTTO=ZJXm-uXEhJ^&1$#X&^PkSm9P&cgOMb> zaI~R+U}R1#Z@1gBIB`ND()(tgZO|6NdTwxX;AAZvZ$q@%XZv!YOok)9jAAa1ce{zP zV>YnN;cB@LHi|RwR+GtI;_O^l6T=wp8wSQimiE-i#g>i=B4CUg)85+uY zw(xb&>m}Mo@rOo!wle&@nE0Yi*1+1H4XlM^?3fEiTCq}&vnp=D9B9LpVmS@wlHp!4 zT3CiL*OWsnBHUgtR}37>a_s5(nbpKH2bLc#MhiXL%O)g_uURRMuursoU-@1Lr?h<| z&<6^YFfi!#@?Njk>-7q6=Bf#i^to+{&aa{<9T5C)DvBv^Zc#SN_{!f5}H<2S}Wkp_;pnJxT6#`}SZBlx|@ zr_sI_O@yuB*}|bxCi=iaa_Hv^bTzggAz+|o-7#IWtgFG2H z3W+xw>_xuFQ6yjASR29Hc(Z+@=gB|+tA#bqR zgc&~>7nzNW4+#6xz`k(}cnfJhYs%0@1_lO+XTpHDA)nXl^-2?Ghz7FB(Lgq8#t)5; z4UEq>&cLuS^CiU1K5!(#aVQrHihZ7t_~U*1V6K{rM*C!7%qwTMS?p&rNUVWl%m&&X z_aoLG@^W5Dir^0r42;pfmuCaxgkm|a2Fh?WkkbH;i?^6<7#YUmh$JpX`?ldg8YsrV z7wz+6HW~;-4vFO`{+f-rX|(W0+HluGniqoLO{9?}9N4u z8|Vdt4c${^sHaNK>lwPr&^@`UW9T@U3-a0mty zY2_#M6)QbeNV3G;Y>PG_5eVkm7P=%m3zlPATo>zfuRRv z!_|bq5C}GubHQS_nX4p8a5Iu5_ya3LAu<-$MlmE^HW%sI<$8&<7x*H7Zr?Z~Z(z*j z<-j*0h(MCL??$_kFHwZ$z)A53X8TGqR+2H;NWw;P1cPwiSJFW5i@joKt!tsYh^Cf6a4)@7iw4lG6%Zu4?vMIKq7-<`dxh}<0gn_dU z=8>-)_@cdVVhjv_f?lq}S{RPy;aJ9Kq7Z1yxu)b?Q!Z&Z*BE|3wGd4y=D^q$7Z`ge zSHi#&26|MgxFJVzR}Q?5U(h3HvxQz+3u!LTvx(j)!orv9*zLPEe%?!TftR_}%3BNu z=D@)*6uP`8&QLA}ekEutL4yYc;a>LyT_tE67>k8Jq-)BhSPI2lGBEZV5k%;5Lmn>s z_KiX|+_xUwt#o;`Pd4bPxh`w2n(LbDnhW+rF2ZUq+6{!!O0gt=${TDXX)qBMbc2Op z?U4*?-U|kfFz|-^nb}~u@YeIaX5&{2N!PbA2=-zP-)qt}>@}4# zu5t`ru-E5RDdU<#rHpHe3w*ulk%1$53v0F)4kkjJp_~VfFk3iOhGZDzqJg$B7Sg^T z*)7h{BaSwHH<>M@(Z11!vw>i&EI%@=!NM4f9BnxAI72sbA<*Ux&33sC5XfmPLL9ubMg=7cG#>u|Dgo1EF zLE=I-aMt4*2qw~A4}n0k+&9)h8W^)el0!H0J9i_!+6R)OYjP;(*}xe%y28@+5a^9I zmlYf7+9PW?o9j1Lwvnz_=%Rf%8pKfcw-CsajW{^sC<5hh-|eHhJQ(d8L7G^S9!~tB zh2*gDlL?8j?}N=ooLJgKm`4MHLfNA@f+Po1I3TBd1CP~WF7b!-JP-D{VzBR%jbQDY zd0@;d$J;o@Y~!w7Ao){%Gj9gsW2uVH$ArRCVCzjj-_kzHgknodaB%NUYskX7{?odVk7u-Bd`6;XrD)Z zu-H)PqQQ>Yz;X;}IHciG41>NO@I}6GBn`yLMp1;-a5l0W!627wD^;q*f^1bt*jM{% z-cK0{d7hB?L+%B+!f`g~(PXeJ;m|0OxbNm+xg1|L5f;1QzEZr=Vjj@T0|EldeL$Wq z{Bj>m$otBejT~VVZQ#rX(rz~#%qGGvZJ;gaiboESGSViFvRCdK!B-7utA)1D6K}Rz z2sGM8+-q+Z{)j<;rT5BxwK1HPw=eeDLYbF~O_Ja!40_V#>Z$Ux*V9v_rwZ(o1%WRdEGNERrR(q&zJi8mVeOM$ z+C1qL!lBZ#qs8P z2n4c;Weyy{8=RLI1is2J2D*NYINLu9eJ%#O-CnMPL>rLnAY2gcARJ8$!jYxz_Gt6U zuLc8y#Bc;}|A9YSk=^rim7m31_{nG=?RNXTT`%z)!P*CN`K&3ySt%3a4CQj4SbAc4 z`)Z42kS#n;m~Sj|VD77xfg$((Lhidw?i+>|+60B8NE3r@IFUvZWdp%zUl8~R3W>K7 z>;Z$u84dRuGUF2`XA3_oqqqxA`Q}P49Lulv_?50v97oWzg)tlGvI&V_`H8pi@7J@( zL0A|B#=P>cR{Lf^uC4S`asAlB+E6K$HxWkGMj06N2~E;yIGG0|im;*F_nM7g4M)qB zHKA7-{s;lVKH94WdmM2v&xI4ia;O}|b1pF)Z$RYiBXKg(3u!l8>=7hqBWM#6U6bE! z=%Z0_c|WqJ?a^RxUZMz-(ZHK1(manQqk*K%CelLk2GYEkR})Jb3Cd)k>&X%%hd`jg z@fKzT)6i%j%%g!hF^Gg9FBalxGV;)dJNJ!0Bn=GmMlcq_!ciszV_q#JW42I8CIfR{ z?M8aDpic-S|G*z|8VomXv=*wn@BtN1&J~b90GsH zP*(d!(H6>NV$2Kk!b7=I7XFYAjiUHdj^bp@29{(wez)7XGDfAx%_r0|g0@kFc|x&| z_PU8BDf{+F987!!Zy^mv;=;dL=vpjm;wbZGBTc+rib3IRHhwf5OpJZt=y_#m!+Aqx z2oq^w&^O#e+x`0_~dtAV&$ zNYY@o&;ts|9~*hl2zsy(^l0DgyNTm026{te3@l-w%_hRg@C#oaIO4)MAuW7;C0Pr{ z()+;iBXKZWc=JY>H#8Gz;!P||T3C{_5M~2!GjR6R!kHHXgFe!R^T_YV`ys#BYc_gA z;|G%GywST|l3@-MT1ceHV&nJo_j99tLFCV1`Hduw9QtTriKB_+>+?V$@g)udeO_q` zT^MhY^vK%h#bVzj?el0~ID+L@bBS>KW>-cqD0eGyVh|1- zaU>aJ14&mdywSp#l~Kf%ABp?vDQ`3!jLd<{ydhag#=dd3%#(Rw5J-L_IKB?TO@gFX z;%>HZsHcjXD&*~h#c1LW364Ky7z+wxFC0k=qKPrvH-2RZ$D_eM87ay>K0cF3B+F)yA(3NASlMF7%CWtUQ&n1Zm&xGWNN=683qMK(KEty^m(Q)yi9~ zbcr%s7z-z7wr~gpy2=OMz!CP{LeeIZBb4FG8^sd#$-J2@{3%7TMtU(DSmwa;CUafJ z0bj0gjJaGeFldl=tA(Tp^F-)zGv0FG>kCKk4Hh?K3C_l^q|rXvLuC#uN%1!#xY_po zc=3*fuCF!=N$&=dp=k4lVBZX+4GU%APkAfD@w4GzAMKwRP8=se@HOoViiNey5e({) zT}4L2eLuIs7_JOyx7zmz#zxT_qKUUdSSXW$B2Ki0F&jvGfq$cn{BAkW3vofC%QgF6 zuBlXsg#d6AMD#_BgGQ;4aPzmIT`!5iLPTkLBAQn1G0rQ z5cb_jF`R+pZ%A-Mg$y{}GnOPsej8`BP&VR3(lt2RKra?Pfswy=h?O$L3} zzVW*Og)X2lh$fb>Z}NkMG}sWVB!_)-eXD_`SK>sk#Gx7TY@uf(b59kJ{J>u*acD{$ znityG$bdm34t7r!8ciH+Aq^g8V>YIaio#9 zZ;UgP^UjrCO)NNc_1m? zzM5B(;OMF{-n^f31{*)Jw1Kr5NWLyV91R}r!^OPXD9XT?O?(Z~KG+S6U4o=cCepsz zDB3*G_R(&`KG+MCks#3b5(2}Zank#NmEX&?_zLoRNYDlZ3x7%vw1u>i6mQ-r(nMIy z297eX9KVwMr<{=@tb~E1>sI?p(u;vJ+xG+e5%OZ;Js>TV#Xum~cPnk+_}x4(D0F$h zxzay~gGAR=yc$@NL*x(n{dhMJ zj2#Pc9tn~oSjxU15_j{&m<{KNrFX-5Fxm$LM-ulNEF$!{DM6C_T)#pg&{oAw6|WYS zHr(jC6vfdS`hkt#2!=ndNiZx&aMw*7Z*O{j%J1g-7M3(oEM3#U*GG$;17o(3_Q6D& z2f}RN2+F|Gd*MjeZ+d25`HkRB^g^7A_LXA!SAH=nZ?25s=GjM+9R!Xy*JTd0x$e1r zHO~f)Fjd1MVNL$8Ljfj6-9N|{KW z`)b?5+BT5pJ@k#^=an?vCj-gvwM~SDgE-n3G+6s=u17GGg{2LQg|6RRaTEJ)-r#Mh zeBns%vyI!tu)KvMj09t@e-Z^4GhEJaIrGKmIZX`$CrXTTMk;8I|0-P0dUl*~UJ;d76v9;m!YlgV6?yQAI(S8{SH!_9nsSe5gXf4ec#bH8=ZG+Pj_88th%9)H zsDkH+q&!DN!E;0tJVzAeIU=6th$MK9D1y0&Aef5?%3MSbd=l+^iO7L35k1+G+ZY41 zimRxBR|Lh2TAM_xt4MVfrS3w6x)RZ8N<^lqs5BLkrlS2@Pf`_mMI({u6;)C9is*ZR zdA`7`FCdyrBKobIeBESPHJR2-rWKQE&A_zInbu3D)skt&z_eB}t&~jbByYXIE6H0U zd8-B9T7kDh^43S*>d0Fgc`GAtrNCP!@YY4HRRY%-m1?JfTleWNzRA8Pf@aPIuL*81*TOIILLf$&avYk60`&l2_4t~{R|7mAZ@uHKcD%KYx6<*}0=!j@ zx5n{SINtikTitkT8*gRft!unhjcZNgS_$wKjT@K$ zz_bS7TETdyela7}i@D4OraP<7#iokIrbSDjUa=z8 ziX%{~xK=8zb&6}1;##8^0`G`aC=^-b>l0s{xYj1Fm5J*F5U6oZpgzT&=?Zzb#aAC-px zsJCksuhljnwKgG@HX#*gLMogIso~e32dT5KvTFseHC8L^t*^I!Z=K<--dkmO>zf+G zOT)a?&CgE0!tnKluWi1%@RiNi7Or*8wfan}n##gk)4UbUduCeAOlz5IUE!@Nyp_zf zj`=EPL28(Hs9+AHez~W5xuDH(xyw!wjEn!-wN2P*U8&)@^+iNohEOW2`1lV;JZt{v*bGrd{@bL zluWxxrck!y0(DT@O@}0J7s=aM;O#2#c96W?BX8%(+colbjJ!hJqk4{x0&h2gYq!YN zbOAaEOuIy;T?DS3B64(z!~ub8mk1p5)ji;?6NYPt2SvyE?w3ql|ejW7K7IbG%&v-cF9Ui{pjkyEpFX z-1x4Ik1`qaOvbCp=-7Aw-5Nj9e5b~DX?&-{v?IU|9U5&a9#O!B8&JJKgM^ zPId%bI`Ey?P`ZzcdFEo$Ty(H&_Zmv~ZPCpzm!qu3JZrINEjn*3rXKekT`w8Jv(NSJmbOgj;--IePUz_qh-?Rws>%G*)-E`(_Z!rOiDb{@Q42XE(kI}YA% z%G+)5b{f2025*PK+g7Q9^rZztvLD0sUG-Y&}9@w}Y`Zx_MaLGX4^-tK|7+j%<& z-tNiUHSl&iZ`XP|*4wS#PW5)Fw?kdUVWwg@hN3&Yo#`aH(mNgLC%S!#Zgfv4x_0&2 zb>GqNrWCZ3mu~V>O+ z+bCk5i&%6Klno;0nTWfIple*I8bbg<(|9QXhGF^;6pbrAwcXF%LA1b)W)xX#idd#!J6=sTVKp;+>qll#46f;!3r6X%;WV;!3Z$ zQY)@iJf&h3o#INRxY8(I3dNN^@lq#V+QgMI@zNz;s>Dl^cqtMuJ>p7@xY8o7bcibj zz?BMdr9oUN5Lf!cOMSS~93~zSQ>8+DmCK1$rl(r{U9|r?aQBr{L4rQ`pnj)9hn@HSIWXm)4UYTOV7O2%uCC>D=bHamy&tu zn3syV(lA#F=1RX@sh5{_xpEmrx45n}g(*d0N>6yH2`?>SAgGpqpjq~TV%dkOvm7Jt zfs(KsI>M8RaHUsXYUQOpFReo5N<-j*g76OXgLj}FJni76uBRM~qElYF!AmuGX$H%o z7%YcgupDZ^a%ct1p;DGZDOe7jU^z6(awyN0O7PMMoj>0<33%oNWd1oZ=w7@$n@J>kH`N%sRd1oW^51Kx?q^#{&j9`a5@-a_8#fa{s-B;=hr$U9RI9OfB^RpaoS z=?r8#8}LpB+%N%oZJ2+&(~o!d@yi<#?P8 z&@kh;&GYT<+l1ri8$aEc&Ni;yw#mjC)2YUErt!`sz)v*(Gk%(JZIUr<)lz`w8R%}H zIe=$J8O}Vzxf{+L62Bgkn0MxK1a2 zHt~~*pG*8yVmgz!P9)xW#5;|6FXEjB3Jo*V)1*%r*1uX8Qb8b2nLdXPSxTdgf~8XPM~=R~3F?k{O0M=A9{K7iJhTJCgzP z-u=S-a+~Sp)9mt-%R7^HVQzV63O`Y}g)3k)&uk{mW}fg)6Y4BsI<@@F@)OH+lJK8y zVTy2_SJrs%GFb7MJwK~VCza_8;hiA7^MiMK@Xik2=~6Q}n1#F3%qi2k!E|acof)8+ z7`*d>>ug{%i#{_gn9d5OQ_B14-DGBh>!jeF6TCCZJ9*wmmzi^&5?p5l*9pP9=oKcE zcRujWop(C$&L`6eW&@w5&SZ|F!m3r6t;tN*b#<1hy3UlAiMr0yTJBE4^v=?ClAd$L zoaHfd^qitmvtDO63NP}U^g8Ea<^Xjk&pCOo;Dq70%bV zl^kYD{z?7|{E~o~XE5vhWedC<$y=ZT*CDz7$nVHp8aV<+&R`0>PvCu#Ujo-7pvXHz z;GGkB=K`80;V5e$Ag6Nz_K29a2}Je0X~h#^*gTH@y>O;)A2sXTY#%9 z$0HoaJF6C9IR4-_zOoxvxs9#N#;4b~%4%HYG~NmDj>h{L?`FK0@lMA30N%%V7vnvQ zcLBTy;2n(jFW$X)@8X?{_buMFc+cV;i}x$ut$45Eor?D^mou$kCx@XN z`LwcyHIm>$dB) zD{VT^bU4$)=|9uEOh4Vhvro%*4emNN2gCk#{d=F`-McQs^*7gJc!N_sbHT^XBmUle8DVC!L(b--Dv(ZM{sEh&awrYxq{1ldW9oc zg?T3PNz70V^8|yr{^h!t>s_vMxu)==u#``jf=xJrqkNj@(+?cMB}}lE&vKNp9Kj^K z^9V=qXr4v5e#Oc=_ee0$61+=rl@H+v2H^<);JOFbJNR8c2Xuq!QHEfiAy_p8Yq07J zu48chf*sg`zXCc1{{(-Oq0BRsPeWOP>k(Xs;0K2C&JTQAv;*(_4othB{N(8kyqa|C zG-=bM8(5Ogt5NGbN_6YitJQVY_0;ur-E_Tl-Bq7vJ-RM>HT_k8>N^N{QM1P9|Cv%w zGj+HR3S}g2(`L?#2C1Y`n^~eDx-#B^!jgN2Zib;?At6C(GqD(o8M)0r9TX|&CKMgU zm@o*{qfQx$uROz47+K03gpH-JraWbWF=^&$)C+=e9j5Y^w@jL(PLHmSPLFO7J-RtvAKe`FibOZZQxYjp zrf=~;goP+KZ?lbPhEbz_^5w}tTi$XNNm5C(MzN|6lm0%^jJb~>CKBJ(3C3(Q$ILAg z%g;n+A3DsRnPzUe&BQXdOf0j_L}G54ZRVE2n32JlW71=W^4vm#VoBzd8L5m+Hf9h* zG4+^p<{XqI%3a31t;30&$U)RTMq(sRWMa9D2?iE}@rGCD+$;l$ z2YHa8m{QhZ&UuD^uA^qv`SmAP6iSb$jKot;WU@xh#_VI#?Up+T9da|w8VoAyu#~YF z3krowLa{vELVC+o(#*zBI*6fEDK*Vcxy@Km9TnPU(u7jR95d6*8Rl(5d5)Q8LNQsB zkx9CbXIPS-X=ZMwd61cALOGG!%ruiUfBvD2!FUibNRmjvqEhM{Z}}MnW#bu!f0-TB-VpG!z9xnPZ^c*&rnQMDijv$GP4XYI?{uP^q2}AGr^dwf7anAZ+Xl=Z#m6a zUdm9?3}qdj&M+C7HL;+%rBq42{qu8>$ISXkrGw(1Nk3T%X(+RFSO+McGTTtrw^%FJd_vJu@KEcWhxVj(~QK=ddg6Sa+;;QWht{rbvk`M z&wwejW^D8AGc&fijhZiH(A0#=ktUOcU$~r6GlI7dOijpzn$Xy$O-*RXCc^NAjFrDw z`O+i1lDkrVwPjaiRzeXBX$xKWGPXGbMEhJ=4H(b6q48d?xxAizUt-{EGA)p!=t79w zi;ovF#DzGY!w89LMsUp+GBz(HZv493#5K2&CIiPbG;tJbLJy5$NHT~9(1&(Lypa)u zMvInFiyrabvV- z8Npm=#`c9`yaJtF=mHI(j}|R6Tc~Ep%grZzjWC}OcZfU0Z5#R$;=F{oGGh}6~BDFvNH+Q!)Pxj{C?0a*2 zd*8Pm@*5})hhNjN(Ehp;#^qQQCk`sR0kS7sxo8SPtj@!qocmW_Sc{*NL+*;@QRCFWSXUvhqwFO`^?kVWL4*IqsN{!UYs>$r5K*i@lga@;q)GwAJ@HP22Z zpN}q#K6zwu%Xg4I<0WTsMu*t#*=12S^7n&J+}SxVhm!wq9*-#W*j?NR{Y3(w*<-wy ze%G1g-I_{q59Pkk?)KPg{cZ;tjmT28pP)&+r+IbGiT?1QYmFEY(`9V^T+Oxk^! z-=+%faX7JM9#Qa*?w~l5OuI-NdWnNu*_&H|f2Se>#(fb12?UxlDuP_XH7QlC#40mO z(_`s!xRvD>!r;VUl+%W`WU%SRia@|t;$ReDL!0xY909j7z}E_{GLx+4-93^_xu6(~ zx?b15IxdfdTWR5Ic~|pFFRBNk#@DsikIMt#R`>9=T&tkc3zhTokRy{_ZOV7zU!tUH z#X};wYQ?$GwVz>pO4_M}yvA;#U6fVJ0qw4KUxd|q)OCc_+Y6B>D`FHPjIGq|XzxdP z&xOjskF9s&oU4SA1IZT`TRTZhVY*0tYUfo>i7PDPzYSoz_^*;YZQ1KOz{ zu$@Syv+{9#E$eC?9f7%c&v!D4Nm)CoxV#r%D^JKP+N+<~8`JWVX3ilLPRG+#TPp+T zDrNS?QiS@dGL7QH1mFumYr$D!9FRBvFs|lXsdW%BzyC*~{>4_JjX1MmnJGuuyb>nv zD-6I5Ys{>1N(Hd)SL@Mv$M?eK-4@CKc~rcxxjO>TIpPakYy$%9U@t9sWGsO)^iIBr>(6N@@D{q*8Dc>c5fpb7_L|r3DTl)$`end~KJ}Y;U zf4*6!2{1GoQh)Q9<7`%eZBD@wdr{5Q%SsX3Mruf#EpI6yzr*8-Ka>0+z7QTB6s*5U z@J-9xvl5lHtiEU|k$UCm7M#QiwsyDmio_5=7bYr0^?&R0HVp0~2>9|I6rdBO-if-` ziBgHMD8`GKLqSwHv_{ij?y?sxix@o~ZCc(zCN5Eo5-VPv6O-#r6oG(5%#bn_gDSKj zN}QN64sC=3-xV>>bjfo)Os*;|f{#Iz= zEAJzJSLh(GE40le@63GcYl+3C-qAR_%WF=jP7fku^E3@r_|vIc7mEzC^$il!Y#<*1dj06CXl+_Y?E{=w8G!Wl0n3k9)(nAt!CR!|;mbv>d!6;bbtSQZ)bNAyz+`A2T3YUmk# z8dN^HBde$?saR&5Ad`kflM0~dgdl}Dx`W(t6sGV z!!7RP#rPki`Jl{qSVmh0O1AJ~yigDWAk8ApN(-;+3%#huHKf;qM(n8~!KuNUF z52Qn(f|}}8azKQ~mF|9B7VHxXB9<0ydr|=9MK1vqGW91a7Rp?@%wmh&`>Hwx%}b9F z%Z@>F{4rO!)~;+?_P;h)#*1aeDB<^}N<27T?b4TzWzdUp?3PI0_KYN*l;s-e`hxsq z%~5_%2`Z@{%xhC@bwr4V^)2j}mgi^GPbF&k-a_9yI^7GWeUtnlSTROz{ZWk0;+zeID`NTESf*;+3n;=Fq~n z-^Tn<%QlK^%0oZykz$#yjY6@mjXIsIJD*d(h*Q7N__hozt)3z>-Xu+O!oU9%Wem3v zMjBK|xNv$mpQ0k6po03;@dXxrDwQPK+W6zlJ#s|97E6+Bg+zmAWNdj5n_v7GIbvvm zRJL!c3#Hy+89~^$;KrLI99ZcTD^)m|bC_GOn_I9&D}j$yCbU#0?#{}HNrIRuK?DjA zD8D|{$1m3{veIE%-$Vfzq^fsQIQ!0f7h6JAHFO)Z>uAv8fqriJCSUXFe~2wDw4hLS zfu=Un*j-lUam3!a7@@?pDb?#!z3+nZo$nt>KY3nz`eB;tqb$yS3nCsDShOH~d(e_J zHI@BmkifsPrP;mjV+tM2(+S+A^4C8RM#_h0LpQi{^Km@#GR_c`uT)X+%S#`hL6F)9)nD7Ywr5!u;p=Rk#cW&Mq$3g9cP z+5Xn^Sbti^{od)koMI{iyIQ%*O4$diwt`V(VL->XR?7K2L6sQB5*9&W1lN`(a99+=|jC{szA0mF;0twaB@!CewLgP+){rD!y=7dMwk(R3$$k&?MTdO@6T_ zZja`>neH-EseIB!eoR2MN_U~xL$Wp7Z?b)>^Zpt&N4$#)vQr9Arwq|nV^L;G(R))x z9v!t?FLIdZYuM2>_Xtmku9r+D@~y`;st-@Ea#8-NN&b>k&iZGC(=KL@R&9&hTl$@C z*JX1e#0%P0&>}msNu7ngE@lsLqVjoUHFBY3Y?HtxA;Z)OGqNqGPa(23L9(v|;^t`s z#}eD^`dg~KoyJcKU*koYR_AFRGOdq0H=h&x+)+db8NMM{@UR1dp|wrhIBN=nnPl{B-M9Z|nJ%lb@TpDZtbAii1htw9!g*$=T_h=%TafJJAJafU6mL z#CFd~NW1VEl`WTcp#dn{RyHh4^ty1zvp&y=NnAPGf=bX=XmoN5F(yr1BbtP+&fU7r zk$FX3MlawRBI+0-YNJFd=uQ*`pHiph?v0dgnXto6a`Dy1IFVZ}CafK~0ud%zco8G0 zt+0G*PLV-e`<;1;9WvuIya=s}2_xJDffu1M*OB5l%4RBNoG0&zPaL(&W+~EJgyz;4; z;hEyBZl<}OrU*~dcu&(vPty=jQ$J5r4^LAkPg7gr4C#DFYSPt!`M6>2YGr6Hr`0^^ zjzG>y=4v)okZ4A*XsRCFCSNYep&%uZkBNg);Q2`|K09Gy=<%?giHrGqNAub3c{X{I zw4(f>{KTPr*igRLP`=$zzQItw%FwyWihxP5C@}arBNK~NsGc^1)MSf(Ga%R4lS3rf&SyB! zU?4AmnLhWDa_py0ExYo)dVxjb7V55CBECAvFSzg{<(?0V?=#Uc!$b;8Ipa5-l(hF+ z1>QYks}A(gL%BosPSLC)oR3(m)vOTfMgiqpFDS_OlEhmha&K9AoK>@xx9phcKyp#i zsYyloJEE^5Oni(V4JX>|m^!VS+Pd572`LLzD+=o~-3SF?eX>x|=bgED7ZX>U({SRT zx24`Er5b^nV+PtJ&LLX)u|)BLV-Z=a@zdPbcoC*@mHs>fWG>F!#2#H;E?GaGZ?G+z zq)WDbF`1_$5OJIffSbrMQOo;|n|+F{?mN;QCz^1W>va)D9glOR;3l?ECQ5nV_#&2V z(UTi%hT2jGyUiM!4kpFH zPr)kyoY_d&HatA@D(-Fog$;?o)@5HZJEtP!$Y*k%yyWEPp44hvEho=F$vi<0_i$<- ztRIxV`ttbpt1jcaxP*{JxLQULPZ7yc<;lD?svW}wBp9MpKb4>0IOVN5k8)2k#YzDK zyuJ6+JAPZUh#{wxeU3`Mb1=Io#thV@p`TD5`;rGydiMWJyK<7>X?LCEEKKA4EQ`Yq zg}p@*&o`aa+CaT*Y2i)qWkfg@e(<{x5nc<2Ai}HQ?1=D}NcS>iU|TBZfRdv32T?RV zb}-*P?-IDtW#qD)a=;esDumMg`B&wIbOjvmVVJvw`mR z@S*UhM@y?U?{1yTm4*)-{B;R`=K3+LFWmE}fA#tIi$nUO$oERWdpg~^K2oh_th=f) zzerkNVPAcEhP!pt9MPT>zKlOOyFnZ^9|xeq=e`y1p^5{F!y#};Qur8NbLaap5{KM- z5y3tgQ#{ZY?f!1^-e+&Lqg?3JO*{;Q)Jf~tjOw?0EB0lqP$7R&$@PQG(Q5~sS$~)j z5=TRLcZw@G`03I*jOuWhH#?RV|a5RCfHJ;^@GD22H_g&BMuW<4XF>nZ41)KIkhI!h$;Ul!wC1lRjt= zzkgphD_(lrm2S0+xFT_M>H>*hqlpo`Oj25*Mt3WRxjEIF`_m942$MRU0p!?FiqDZg zOJR`r7)Qe}fs#n}ABTI(u$B3i2cCt+K7|pg6Q$m`*VXm?hnkv^KEUON*P8sE{~49x zOYzE|wszGNH{&!t&xWO1qWh_hXSl9$tWsDOx z+Cf&CE1j7u3Ey%tV(rjZdUQU@!u+V5a|bYx&eNI6(P>!hwo~lJXQ9xNA%8Y0zkKDr zFnS)6|Ixer<95I^M><|bC0-jh0ID~vWfUe7#}6ddk}s!rWwLZ;3IvJPKH8AUn~=!q z+$O!R?*#yC@fyCEWHL-j9~~tnQ0U{T^w0(3c@%o9HUdX=qy$ECbgb6bbgu7{vOdL< zlNttu#JA=whX3LDt8`*+qIUd8x}2)Ey_54O@ktFdtx>V)q_P=O#f(E#cR~v^QCaWZ zGBPNHa=fchI7cc*3(E{Dl+;&ilJR!p+zaO24(8=_OB~Vc+T{JH2;_wT+TxFEeC$fV zhM_J-l<@6K8=m{|o4oH%gw%CJo6Y4WoY|F8Q}ql_W(q07+L(4Cq)|`|OHb9yaFvowuOpghqc?jr_x?<2M!thqn3o>` z1~gAsbLfBVd_pm$d%&sHmKo`fZe5f%OL+?Umr&pPF$jk+NmEw`{ zq$b^2W^cN~@>~&r#Fb4Ee{eBCO@W)^=^MBGN#!s(i?Vej#)d9WRev1-a0e*8$~5iB zY%xDzA=nf`!g$>~GmYU!!gyiE)wzOjL;F>m8BL6kcUzr{k)Syn&GH=eat`%T9r<$D zVBh0$SW6$Qx(}A$=hBG6tRw3fsg8Ez!@c@6F+^UI2qP93qno%l;xrS!nnOXbp&&3) z9MO!2o%d!vTg@Rq+8u)}^unsos+OYeUZguzEoRx(`*OXqJ)2zMm}FsJ*!8+rnbFcl z)!6s~gj|jMQ9dZcssm#cGhy|e#|sv7DLqwJzULyTfCxr$$edV{aULXpOuFA7KTfL4 zYaW6wGzW5YAf!4G62)g6JJZVHv^xl~V(G44u*evgWen^Uhpi)PqRD-)VpM5_6EZRY z*$6`nU$_$*&eK0mDR&#aWws%*S`b-fmG-pqdh!q=3O*E2Mhd8nP!r1>Ids7#aa6PN z0W?RjsV;k&R7f8X;UmT5C7G!tel|H)sliBjDt5aA!4bqt8p8S~nDt7L^+)hKGK(F@ zJg~ozQ?FgM316M^D_ng_R=x4fCvNUbQK=1OB!kY8;)JxJHhfK^BtlxyIo_txOo-ix zbmb=NR4^+mk##IsxKe#MF!VUZ3Y+8;dAWrryD?5d`cSo(-R?CX#S9N{|2k;38DcG z1piJ*K|oZ7q;oe|fhUNH4n%neqV%rn2?7ZRnx*8!ZJ6ZsJ)BsND}|w6gJ}pjBcnXm z29Tr!k=TKV??A+MAYwWY(H)4$4g|ad@vH-}g*Q&Fmq^CaBtu{WV6TL_7wkh3bF<+5 zZbTx~W>&iYUF9ij4rC6_I(Li+Xflolwn6NofGrRT7;9fAqM!YbIq)sk_!(;)#O51o zA9U`3^*LmYzG*ZHsD!UnlSjBqg@m&99V4J{;8SSMEuni5n_G}M6n508dPmA*UCQ(f zF^jKMZW^7GmO4Y&!+}zGA*H6rlhRC~tVt0-H-m=;P+X-Pgs}+wcmkZ?FRi~W1z49- zT4yZ?V)cyxI^u+6AdIw-IT}a~%`!mOJS=9{t^8A8^{2SZJCHIyXfk!tG($^>z}GO? zCC@%p)_%V5T%UVF#6DHpJ{3R>U*$P)uu##b1x_#mlb5M;PJ)yj?38CY``yYBah5pf zYe73nfIg(G0?Tm7Th?rjfWy4bqBy-e`aPnggse|kHAo7VJHEu zScdNya@b-VD6Id$#*gxBflg?Sbib>RHk;EW3Cq zma-#^@`Ey6qZg2`8J6@-nI#bF7ue}r`G_0-?~x=dLkZUM7Nks76_GiEt=d_1U&rL_ zU=nsPp*tAQ9Smp(@DI7)ps;A8mpp0bGihfuX(v8uM?GoxbppGYw6A3y0qbxHYs1^Z z8Ww0^wjKKwy7hLnJM~QI7^YHd;aNq!+C+%a1Xz5+jyjEj7F5QF0|>c<;qU-^2^xU* zvQ!fTtEo4i={Ai7YuQ~W?_Frw9VqV|-Pt|jV(>cv4;}!zVcv%F-iDUZLwV_;Ww)Tb zx1eQoP+rL<2Fj*siYCi^Nb=Xk9O7cC8-~0OOTN7rq3h#=+3c+qth?L5ePo7Xx%=AYpL%q)2$7=&0yO+Bu zHy4~B#$dDtk<{Md8Yx zsz>#!b5Zm}ZlF8Sxga_%H_+m=@m921ZXobf_Et2OY%PAvIV*Z1Cs6fN*02W{7id9r zPK!1pTSN4=vs|%J^c0M?^Bv0?^n{JJ(_h&Ou7&ir(_AeHtTAml$3=1o`2y{GYl0tYdOE!`o(ZTlkOSZdf*XzzY(b(j`ljBC- z9?`GPfN1ID!1d!s?jG-fcE3ye(!kr#r7vV(1yVl0bB&a%<|Q|-|`H9O8S(b7}xv(X2W?UOCzzg^ayrCMxWwv0ymPqq)u@wg995*udi1xSRq9?}NBYVKx&UQVl z{q4G!OVoiA2}RG2WtZF4FPHKIpB~HJ?kVVNS3tJO!JXNnvGEu}uC22yogY?J?`do0 zf_++Tn-kN5y>$F1KRs(_S&7!g$ci>6&DO<`8)4;#UDSQr3cC@QMmB7l6ZVr|y&tv! z)3{Xlsh91^!MQA<-E>Xpx&M3B>%v{Z7yX`yefCx5maB}O|#Jtz|xEEsVt&+l5 z$0DtXTpxF$W8EjyYMev9-J+}a8?lHb%5u@Mw?Ywxl;z+!AHCBCqw?+1w_Fiy!ZVe< zZ^f)3OmKUO@|w}N0>=#oJ&86pY=XQZ|q8Q^S!GhADa@mkW^KB`1VdN`ZF%=M;Y zj21S_N45gv5N(&gpB{Og<>w(;QHWC=G9^K@j=a4ag}x>`wq@f0 zEwO_N+2yfmMMFaqpEep(Ubi5dn~}}0kx9XL2A+V z;DpD9x9mxCKHSj+FCzk7Vw9gqDFP2p2$4->d=m~E3%R!TMWi^i$|2a}8D?X=j*yw-j~OJuVhym{2c(Gy_q;L&B_;Et0~a23a9 z=Dkn%i0EwYf}vb)0O%?a@#YRL3L0ibq)UY_g<(bJ`#Y0|OlF3>R1P(nO!jmjHaf@> zt^5RqJ#FYNwT!I1bQ-0rXx{7BT4{-DVeD=hLEfoB-mdjB(lh%J_66Y%cB?jFxmtY% zto?6wQ@qOMa%IXW9cmbI$0!aGXvrrMe8P@pmh*@D3RJfpxy?BoxbVu-30d>t*rYyI zrX|Xm=2$T4Hd9TMSNUO%$%?RyapxV`JAdl^7 zIP{(?VjXExzgiS~KkrpA*4@7~)l2Fy+w zanzFpZK6%`s9(;3DH#Dwfqt9rFAYRX)1*6zHb4ClJDqK|LYLzkK8kHa;^-Y&m0UI4 zx`e#CxVE~Owz}xHy8L>>hGH$Gbz^Rlj_=eK@EgsJz*=J;svb-0#E9zoj7pIn`DHy6 zB-%hm9Rbu0470bJ=c|~#3XIrC$4QRhzxOjADxQX!LtuB6M%iHT4LdYm=IB}+>A)Om zvsAB4!&Zm$P_S#?32qgx=-7F}R+dSMy|>zVK%!xGF@nh0^UHWxf8zTaLGoVTvkTza zrQ``7W<1`Mapjj*(rKg$qQENRl+zB#~`p(`)$H7J&FORgq>f)VSgXg);!q6nQhAOlJ4Yn7chWQ!3-;G(mXgUH$Y`)Z`NV) z)ycPMhmUTt*F0oUW^;Pf{ZZurAN1AJO@w;p4(fCiC-x1;` zF4jJ16?}<{SzY|rm1{9dhsSyFa-u2mVme)<4Q@yKKVq<)s|6Pv%u`{a2^?58$UOft znEq&dsylw&_1!V6G~1!QFIrlKRNajF1~Ig}SbQ)( zDbq0S0+DusNV!0~a9G9nOoXS5ROanN7|X{$w$mcI#3pa+e%GlEY^7c?1R_mCwqhsSoX~4(&73hsMTPg>`Y#W#9wXH>->LUAC@}`U5)f z(Ed5jd>NcdSHQEvGGmEgt&j3(b!EvyOV70=8huSP&168(eoc+&5*G`zYS@P@T0qVr zXOQ<*`(B?vYXleKXj#Qy+Lhp|=C^pkVn=lf5k>`Z;dY^`onDw`3UUxw6vQgJY|zN)zwi_s0g=_ZqwRfJ#!-5#}D9JL!7wF8naQgn&h zrJ1LilC9jv(7@Cr6s>9p8DXY%ED@{}T_T4!YVII0cZ)F$8f2`b&mT}GGoHZ=T{MO5 zUbujhT)-f^L>5IW$Y2#NMQ>GFz@t1f1<1=-M*|?CSF}<~G|h%kp4zDrF&-o&cCj%1 zy1yNm-yN81_#zojN(U!J=>n$xu!+&{#cu7!tD8~}YVqD}0tkqe^6%`$bR5K}n|&Q1 z#qnNdnr2yHv~Wjt^a|khVDL(?YAPh}JEnOPgW1GXZh}McH~+>vQW^lh%=zyMR_z0K zV48Is9T;M^vX%H(8}V9#py(q^WL3A`wjskAOat%A@D!$A_hC0c-86haYvp!U7x&Wc z6YF|KaLtJcFcwF}%H_(l$l0W{3HHV#(jm8rU{Abhx>3@J6sb9w6lr>zNtYgO_Yhxo zx=}`h-jZ3##-!owg6DFg^wltJy9Nbp5HK5rmF=>rowM*WTLZ70QFQuG)bN zBhiJTLu8^OH+Tz}F=FLXVqK+vsa8^=fKsW{a64m|4?qc^iV+5sjHfUdgAK&1g*^Hz zxb!JW3hugQOQlHLkSe;?8T@#V47v*XzK+>g2Y=VaY}LVbA6st+f!B{Q0dVj=JcbJj zE`_L`V?vrtcQJHbm>>u^0-V$2hsQkbDF2D+dM9-P{s;wsFROygK`GBML_Fpg{Kp0S z7Hj$p9M>fE6XVvj9|nF7S)^|oj{+;XfCF(D4roCMgmM7mMTwNK#vk|6a#;G77sC$s7x%#!NDW$Q0c+W$WC5vG#Oa2^oaxezLZ@c5R^V7tRwrq+ zmLUT40$;BW;Iw7fb(7TZg7{@0n$gZrWz$uk+1}n=t>%~=vW5tLJa8P)nq~@v}Zy+L5O?9M1s<$L} z(_%=m#xR;L)9PKH-bG%Br^ZY`pu`vzAHH7Y^{$sB*%#&9T>VY$P0*ug zOgckpC{Mz>9$bmL1aLTnEez^Ma#20(kjW7!m98cltHv7ZPnWLt12~>0zEWbxevuCC z5FZ+1t=UF>+Ca^3M6w0arCHTW1Jop?(e+YjNvSRlbWmQdhnTGmo`Qv!-U=@%Zft?C zmxBtm4w_Zx!&61jk|OAOVYH+$V%Mc(@m)|M&H|AVVBwddMj7jGn&K~&;!l^tPo+Da zoI9)Cu*^oe7ig$LKA*B=4#nLm*wUTG)W9_k+9jT&pHSj-}6@*glY*B(w&7 zcj9n;ySrp3adA0GxT+3$$<&38Uu8K&Ni|8HqPUtQxp4KLLu@xxy`w;_zKDAkqd)L9( zA|ic(>gBu}CVQM{;jUoes?bUVu|^}}tt^h~C0=frm}Db}pu4}V>trdnL3g74d@$J| zL{wz%qjI^aDme>GoMvB$#hweO(H{{8RJKaq0Vj*KcA@P8rGB8T1NRroOp0;!^Qyou z^iLF*E2z>R0|l+90-Ne1ES>|yPAkg6C z<4TqYn^b%qHD1C1x*#Y&p3M#(t>V!g)vnV!)JVu2r_IEr3&=}lvk%3xQ;w!xZvwAQ zDzD+1s&$m+HqkDD09P7XWaZC}Ts=XecCU+dB!&Uj9}p%Vr=27nRuqjHAH zYKBSf<--ZBl_H}R_I&OKwwo}h^;5jWJ?H|LD|Obm)*ZxY=aPZ7AC%>mywp^h{#oTTUP8G}N!~Asy{11+=&W)W zFQF(eHJL`H418W(i8r@#wRS<*$r1q61^p~Z{VZYqEZ+Sr;C_}GZ^XC~E3X@(UkR9_ z0L)MTrXE+~Tx{&ob>)&6Is}4zg|_bQv|uU&B?}E?fm(h%fqk(rZR5uFB5b(v61Smt zRPuBQ>|uK0WaDIZl#qNDI%{S;n9(jjlVa|hq3#Jxs6u4dP!~9x5ky`_8>$egEbCs5 zOKg`WrHm_#0LbP6WUZkKMA@7Jr@p4<-G8dYEN-z161$m)h`G|#(&Ix>%8VMWN=131WmMwyF!oZZh_41? zng_?zzPa~ZiB`GhRypP-XQs`)^<+o1xfkc7;f?n-PHPP<)6K0|kmX_u+OkU8CPXVn zWVwJsWG`(__=8oD;L#ZAQKHL%fViGz96r>qS5uq{A4;}WW;(3Ne3JjMm$CG(Lt-9( zNzndgIf3j@<0N>dJ}=6W_GX&WQO<>2QRZ2pt|gz`t{!nY?1~uQj8N)5OB_KHcuUyA z_$M_ipTUDL4>A~b_5cnGVL>8g{^irHb)jXu9pyW4D@wRkNa+T0f;Lkwfxvw0?iGmS zFU4@w^@etYqITGcD`h=1`;l+jMK!SVTU}zy*Y(nEr0r;W%49m)ge>7M$?I&=V0EFq zv`5TMKTyaQT3g%`c_bmp%9GN)Foft$ea3 zO{QkpuKyS}`OK=e-2Wi|U^V?BxWF(d$|U$Nc98 z@Vms*d9C;~y~CzK$Y_}lmSFOqq3r$^H+=PTven6W+DJ<99lbZr&qAE#mG`GIIEbMw zR{!KUG&AX;Z9aXi2V%&^_l%p6)OGCR$Wg~m|7R~2x|Q!3{`Y0ni_VAG2KyISO7%wZ zzrPP1+JdJDLw`gBj~XZs6}^mF$GczO9i-RmPW`AOGT4g6{6}NVt4Ee! z@9fTh{X0-q{_809zvIR@2I&CJZ)qNv!IX3VZb8m}*t@;>YB71_*z$h7sqdc6#eUI& zS)5JVfW~N`%==9h^gzSYe?|H|dZjL!S+6c7=l_F7|GqoG_aP&=?kM3InJm?{R!vcp z&!^)na*5v@Yi&P6hE8`oZ3^D_w%#}+Qyd-UJ{6xG)<`G7AE_XRU39L~Zfi?({0I`) zW_6xYIR3BOX?uUosIHZ9np(LWv^el#(bJ2Me|iG9Ui&k*A5=f%-?smVEn``9WLmq-LKiyOihUDrM(^ z3KSdod*$cN3L;#S%Q~8CV_K6pjYwEMb@tv^K2q6NuYL2DTjkQA=Zq3kwStqjY#cC1kP;0G)OHb)Wy*fOaLu=EpD`sAZi9jA`2D|U`(580YRg&Z zsiR&Ec0F9vdHQH^V^=U!re}g6Sy;XkX*7^}5g*y0pYb0oH6wH<3Z%V?eDX0Xl+XR= zALAt{KpCkPqv!LY9xIFAZ+geg?I9g)AFhY{pLpqwk$#1qFyu8Vn6iC7r~%CbFm zNyMmFzJdU`w75w5kt-VOOYGwawbjLuvD6&>uK4Iv1fcw^<}b-^XL0qPJD(G$@V~ZL z(YGOE++9D`Mq_%b@xwr_XztMW^6Q-#JPH}cc%r4xfPgo+2cdTZ<|(?{e5#$>F`o=X$rma8{r+($rp+> zRoSbQ-{F@sb@A;A{nDjQ=1y3bZoHC9D@R+uwP`+CB4hj+(jq!7s`OCfCA^ z*plbn*AD}`{WC58QAPQS{*HQ~Ab9d(;5;|2_<1Ie|C>HOFj?w4K4aI+=L+Cy$eSh&_hQCzzt7h;r`4QXBVC$C{9&Ot1i|N72|6R|h{5NrR zBFThfdgs=2(9lyRaLUJb^cF#L$~3<$Y=_UtkEL zTA0dl`c_=@7yhd}PoY+`%PRa+(e39C57{rPbMa;oN4=fO-&E>e7nFYq>}m*!{r%1M z=kF}^K=Dr(*oN$NE+hZQ=M5c=AMzu$|Fjc(uE=KG>zcki(Xb1bm^!Dge-k6E{j+_b z^MbNiGeKn8uv}lHN66c-uiWnYYq3YP|D|J@KDeI0Hz-qS!5Fr7=fvYO zNOk=A18-*W_7xt?QSyJZ*LBZ7JFfHj@&{%??kI02`|TN=2jJoMITUo2EV$Of{Nwe<@V52TZsEtmwH6o7!qF76_kMm(PtJHZ zzoC>zP_F+1@jWv14V~AN`+eP}x4`3k7%le;_+WU}Yu2xMexSi8BxPEG-DaEb<Q94y1vmVMY3QllZ)c_2yQASL*2hoYWd0Kvuz8UC z`DolGlKv37{wTP?gyWmQ1O0z&hkV=~vhLNfq09*BiEH*bE{#`zW*>cgVTr194=7S- z)#uW&7)$%N27GFZ=r6Y}Q(xoCdYWjqgf@=`DM6&9utGs>Z?C$83r5b(@4i2r=2kTR zY2Z~3?rz6^&?LTpTd2%u#8@6<5ACJud?y45+r3Se`F=UH#{Lla6JnePl~Q~RuS<`i zdckfo%-FRVMSJlc8KdO&T25fkv+YvxW7N+m*tUth{1Ywz=Ck+<&v)bjLJI0pd-7sW zVmCc^HB&QkbuUG8@_P^XG0C8g9-0D||T;9Mn4Y%#*1UJHVIrhXUv2w(P83&~Cx|K~))l&p=22YAD})dx6Kh|8n|0 zVjudUp8YVVb#i0%1^K&7*TgLnjsK#%0es!-wV#&(jBVL8QAOeV#YH`Qsr`ji%WgNMcU!dlxHplK$`iFluVVc|4xPKolz$bbx*eKQQGwzpJ zVLYuFVh$S#>hDv};sf}0>I)dv1si_Ny3I=f!*;&=tKUan*{s~Uoa}u<>3aj^7CnMiP4n}sPj~Yc$7l&WLG^6*#S3~A7tg03?a^R*g}V>GW$(7jDoXbS1;Z?(r@{W}FoKlMoXwR2O}9{fsP-VROi z?EgxB@%i$bgEv-cvCI74a5h{{nZt22T~X&(@^6d9n2%2hKCXYtt%(0c(^@A7S&TnZ zNDSEcTXr6b*|T)~so4kTm3!^V)am_@dGZbQH;3cJb@@BrUSi+=Nq)(X$|In;94D@H zXXxj6nnwnP>@PTV$O}}{fb-OqLNh<+hKQk>pP7X{?Mn7lc=obDs1yj2CbZhO) z&==)>!w;~3{+~Esh74IdD>}hA1LPH>Rjemizu2c)J=Sr~x@xO?I9{)=J2U(573Co* zekJ$2-o9*Zy~6H#m!&+#?#J0yluzOeOyc_CY&9 zYj^t8;N6{F?&_DA{ZWzb==(7;iN1c%cn;eJ{u6|5G_b>Sxb+g&jBUT1HjI&v>yiG7 zBTrhR+;E9VJhBrOjfKSQ4>F=KPGV(AxMkW830nymdkQY{LQzB|*_w9f6O3^epv&^9Xu|nm89)xa^ z@~LrhZfC5=mMqxb=gKdhmVolz^J(*a!(I7(_jmL#8{3uI_5kRZ)hPcWnj`&A)359M zJ9s05nL?p|H1H<>IDz1!f1jjIK8enaHu^u?z4z?p*8R!!&UVAm{{cZjzQ2Mzq$BAZ z_^Sf_l#6!^2(JS9_3k12Ty;lW%;>}fea}pPlqYwgcKp6u_*o3;`WwJwSfi)zwZTzR z`IOg}G}$d1GwyLA&iK`T{sZYP@6F`{PTBKZaQV9=z9!h=s^CTRGPu{Tn4wnuz4Mw@ zHknMH?T54hy@)#}k`u+#WP6L4wC?cpOUG8h>J&qF)hq&~%|XyS(aV$eOXIiJPlB@C z2yliL1-tdcE8YIWzeMkwjl=79g>`7^2!MX5k^XF~_e6em+7pU%wQL@Yr#Oz!UG(p0 zaT)Sreb1Bsd5tplrssAab@o}&cd7p~&a>7%93{^Hn;yfy55iO z%Ec;JC-31#hR0t!<^PoJT~_7_=Fx6x_xgE5<9-(JfanXI@nLx|7|PMb%z)_1I5Cpf z8R8Rl6sA8drcUe3D}>o%eyZ#=YELX5?#8Bhr^}R%?;yLqjdRfwM|4QGWqTnVODUv> zU>trupHx@iO%ECx~I3kT~LcLUKnXF>dfh~DEsS>fw|=*=s%#f$qV<~YvU#{DN+ zZ9d13f|tYBG4I;p`W59-W(y&g^>z3Dh34)_hiMc;;x;p;_n1{4&y4kj0eF!kWh}q* zAhrVHig0Fur3^e&;PEdJIv2Cxh~9RqSB8;0IrceBx1Y%6=a2&WpwQd(==~yY zW}iwSBcA6^%cYfCCmEKh$6Zui6O`mXw%koJ{08`ZLc-yI%>GB9Q(^EM7Xb?_A6MVKiaZ8i%-J0E(do;9DmO=b{0;lu+5j_# z>D&J!4kPKOGRPCmXHR$&LEbUIJ+nmCHl*Kq6|2sNTHip90sO!@nRRh+_>k-(B zHUBCac!F?J3P04~EB08Df#2xc@E613b<_D74VnHxUZZ;i7=D6YN_|Gp(--yZl{dj5 zcCZp_g0a)i&0}RQdhGeS&haWOW0e+xQwh8i&Bz{sddV}4BOW-bdBF&o5!06_(i!{ zV#;Ao7qdldgw1paAR7ytU4n5B04aO|Jbs^7I*l?9!PK++xRN^uQj{JsM*eR0e~rhO zp>h?hy)_Dan)&O!kK4JBA)tH6_R?o&35?oOvrFt|6!X(`?2y#{}cc}4umxTT34L-Vybn`cEaz^{1 zI)(|RerDybQ$+^HthAfB#xQfuM(}%$<_+)d?htB^(D%~VU8zB7GOX?_X(hw7sH`LPy$CA3!k~Me^M)1$KC@<5-n~G!@!;W#9v30?E$Z03k`D}- zWEL`GNcMd{mAuvs=9%8BqU&}#4+=gv@do$$vKzbSa1`vnXsiB~Z~_h-+}w)k!OiP` ziQD3G7Yg=MvNAt;;H~6~!9GU9bEWJXd)JERyBqji6cf|xS<@GZhF5yhZvcv-<0!`J zUVKQ-pHELtMtVo4tl|49^1v@uC!{_FLKl`i^In&o0 z@b1aPKdlMB`~W$n#*DZDlZ&_yK%97oPZ`ujyL1))Seaq188JK1mnC~aD}#8xRXgggoE5?gBSy&>CM9Y6IY8pSoi4Na|m@brgvxwtY z0&{6z2UCK3x^nx|pTiJy4+uyMnBlDV%)EUvPUke)Xnl@yf0o!qA*0%lZV}Z_)4$N& zKdP;`06PbLA3OEY&gG4j;TTwiM+Cip0n4_y0m=>>?j~4f$xJkFsk86?UbRMgHnKY^>Q2}w#OiZC z>pdK)!O^DYCLr|O2mi->xEWY0l)GjQ3sMV`Nii= zxH&oV3q5o`B(5XWH5NwnRj7XoekUc&#{+%Jv&)@CjR4>gC5eReTA74 zv)^90@S&!F>bbg_R)caLAT=<@53j3>H-l-JD4CIyc2N_5a<55|{VrpqXV|@;Ay54} zb9K0zwSJPr6t&ps91c;})X8TJDVNEIRL<%EAA8r-`LBA0LQfhQh&8dR$9w%v^k_hz z=roIP9E5tP&kA{6V2O*H_rG{f$^U;`_7MpZ2yJrn|6T}s-=lII$rW(NmGnatvk)M= zbuAt#vg+-azo3|EQHW-3 zE3e+w+;M4-*OYq*%6*#N;hhzkH#k42bbNM4)GJ%c-7>?s7>x_3>r?cR`ya8=SK%lZ7esg zMdH8fe=gdwQKmHmBoMsL>|aiGLwYDH`B(`%PH-%dv#+8$pO@u$`d9d8YTmimtZnP; z&arWy*wV3kJ-syw=of{~GT(4*h$p(Gc$YzN9uFlc9QmO|j@ohw^oZm4k;dRVn)(+T zpz|4KZ&bT>PoNL=-oV5jrT@OUIb*w zso0|W>4^Ocl=f+e#6pOYLENLMh+h+&g`DesGf;sX~&Uv^n|D9i` zgnHgg=?Ma>b`Ia-@w`d>K-a()giN=JYA=q%N}YxuzRFi^HCTIy4N%Gs|Jd6u$PN}qNO{>#p+ zLHSrrAFo1p+VXy;J2u3=dATh(6XS754H;AvcX>$tU!EDgAF+1VZDzRUp&|5tEB(zV zdW8h^k03WbB!70y5F!?8n}(Kn=5 zDW?8v%B0Jl{N?92kcBZUYr_joP$Q`s7%vOlVv8b4?wfQHX3H9-7xd#zd}GmzmySmz z215yCy@r?hyW(xX|HkE#O&D?1w~8HVFP8)S=r206MqxcJ|LQjrw4LB7vBugwkWqzJFkm_Y9DV6THB{!8b&Mt$!- zJy8D55K`B8$SYH~`Rd%|DCM+bqXqL2Bw1>R|KQ)DI;FR66H>b57ZzsMmz$DM!>oM~ zgW}`Z0CYB~*H0ijFJ8$+o7nCweLK_hR%l*j*zZNZYcrnn?#VM_y8hG1q>YDpUX@m# zN~ZlGtlOWS%XVb(ddW7zOh44pus_wA@`~><9ve^biB25=6?`d&-%zo}|G7;G~k zff_6m9e=%NFWd8VIe?-tf+(uf$%ES_jkn7)G8-8Q*atqyHcVP$+&4m~8v}z9>vk^% ztj(46LUHY&cqL|>vSkNKM=AC1Qu>v#EG>f-Kkh%SfHDI!Cob3Cxnmg{5dJ0X&zPUN zf^I?)Rr64^?rC6%EoEaH_?hm~rP5dq0 zLiqi4i>m&n4zy{M!^i!uIrEJ!-KjN;iW~)hoP(vFz>P4!Z}~I82IzmxTi%TXbE5P`|jY+E?Y^inVi5xu<5~aZYH-WwOaVmm`Vnz80lrR1E&} z+=P(b5H=@L6y<*ayKoQ;CkLe`V#C};wu3qUirKrG?@H@1s#L?F2* zjgaK5f&V{DY;v_CF{T0-#_-3;e~z? z0hDxtF`l|2t%G^TpI*>(HC`7J-?vUwbG6D4Nb(P*$?^49nm6m^$JdBPP8GImaf!#I z$W0{(qT?e6zy8&azXF#kj*!gVx2TQ^FMAkE#4sQ5HDe`042C)2>&hqb_oXj~*TYn& z%+%vjX(f{>_*(Rg!gVx^bh9ZkK>)vql6IAE{?-qK)vR##>#{WEXiVJ9I6?@nuTZX) z__U4dx%V(o%1GhIxQ@@AJ)gjX6;^ZU*iq`jlObcKf!x?M_aR56CSICCY_1};)^3!( zb~PtP1gY^7gWyTJL@uW#w43!eSdF4~3GLR~Ll3P7x7F+2K^>@rmW|SuR-4%aA>kKhV|wk&W%E=aIwGcfg3NuM5lug7Og>RD&A#;6%_D?VWR|s z?hnXsPEPx}Cy(vqo3^`j7VBVz?>a|`GuK$&*bah~7c zZr)O);Dw&{+JG6_PRNE*&WZnBk6B~FXb>N()Fj+xE9L~Jgo;xMPG zsPMoeB6EvF4Y0mMgX9I&psqqU&@tKbWjD}XB6hOVXx!r$w>Zv}BgxjcvA>TjDY1(1fp|B=pP3 z07i}&$R4oZL}J&(5$OVb?r@j?b-=1z#yd1SJ(S2DlsGh z8H#uFvX>a^3;n>CluIP7u`RFz!)AVj6XmQI5hq3CBw$r#Zg1}{Sngi&Q&yIFIXp*x zM@z-zt$}>4E!2a66 zq`Q$0!}c>}<;Js)=w_md;gN6GF%9^AwvMAx>+?(SK0UQtz{^unXdD#|&;X>YWhAO8 zcm%VpDAlDH6beFQpSF1JT$Z_}`2sVSJ2*TqvWvfk}k}$!rC7lM)FW(f`Hf9K^ zP;i(tAXeG;HVZE z77;FPF2@#djzFX*3cgWI*KF_C;&mRPAmX@%I8QUGkv)MdZX#kDxWUT?9S{?-TzTVGZu-eKRqVGIN^FPDUEoPw)EzCADSBP5 z!B93+YQehG71)l{_@>kWxbcU(NqDxA+~yd+v?zf$H=W$Ahn^Jn$BHfnghs>=CYlI9 zo$*G63f19}1}VtgwX9DS4hI3|xK@N~;klv3^!jtw2d*X4*9Pr}STx2gkZy!+I;3mX zO72e-X=rD^wu)2J1>yc0zsF%In#g-d*_eI5f(1`YgMz1xdEo$-CjFKq7a?}|P@(zN z=WtA71_yml1N_f(H)F+TF?nMsXKQCf0GV&yVa+?KZu1s_=4plqyvszybPC}PeW8;?*y-FG~|y$u0A^(^qJm>Uc?FEzc>;gLCok^B8}h2+4yFerG9GA{P6xq^#Q)f}y%oBsQIv+^ zm_w-!m93Uh_AwU~`cT>z3i@B*3o)C+$3SEpi{C<+fyCOr@AAbIoI;5*D&2lHJShBaGMOd3FUWHg5uNW@vi zRn%9`mBo#05ee)^Ch=Su-^vbVy4xdw=*tPagO^_3?Rf1)Fgqo)M5))n5-~=AJCrRF zG=o)d5XulA`*O6U31@#(nGMu~1=(J!Swm=YIz~FglPQ+h2ez&ji!YQ&R~hTDbee4> zn#o{51Fd^uaU_9PYCPwMtLAGZAY#V6@_wQm&M?$JZcG9bYIhCpunZdAFV8Ce=vs|>UeL80rGEb+@Pb3F?q9kc4jr*k>y^qA9 z=Z)fhveWi|1khPpb0%I#*pwnq7ftRBvioMH_9(yxmn32t@r9}reAyV};d%qO}%@rEv;Xqxp zk2J2LyP8lVq7%c6%BlLF3zkTqJj) z75g8zZ0^%ZHL>+eJR<1P*SNG|&Cl^b!~x^?r+eK9_A)`*EAlA{(4lKwte~t$*Jgq)mw(yKy?;3Ss?mRPEL=2gr)@!sxfcW3;42y^`CZy%QuEj zs76nK35c(Azz4j((fcR^F#wi+26epJW8`a(^jCK)tcvfs$`wp_DYOAhbJ>POMw$k(7oQnI9xeZOU*4OQTaLm11|IyBWtPzx{E|4r-O2bxy|5t(p zZegTzW;wby5DO_1fuNh2fZ^BF3dHOQ4Xwu#z!mB%g}P&T-cI&m7hXb_OI)ML?mu5q zA{s?A98L!v74yE_QExq0NPJ&rk&3)UbR=SjX=ju3`ckcOL`lT{B(Z&7R<73Md9P%2&Ie3T1ID)g9j|$n~iJcLva2x;B~+sPAC(VP7bE(2CRmT zKh`t?G7_$CGGjQ{S2@&55Z)|n#HbmOd>IgXB5bKUwta)-CD+z^hcQeHoLm#?0`Ysy z-P9<%n|H(v5=_6qe`c+>H>nwA5V=GVW7!8JOswUu*}Odpb^3yI^n06M8Q6RdmR|o+ zG1%7Z{BR?}r#x@fC=9w1XOuYPTDUWbh;a}k!~L<=$ky3CS-_8o*lR8^&ImS{EV?4K9wu2x7*=QtP}|2q6tyASz=5n|YDXGk%@>|x_HRWw^ApN?*+mR)_6eM&M z{A}2K)extWtne%DK*h~0di&v-HnaNAzk0-IXYbvgvLsR;(uGKcjQ6X)ApWhhocbw^|H4HX4*sadcGr7($1A5GIZ6=;Y}N2wAHy>ZL5O zKTJ~}I@c>jZyqAAlCOpIdrTq#?f(q){OGW6nSoJI&rSynk}D>8GEd_q<}S$0)Z~rQ zNEA*|$sfE0;8^RGy<5A{&v&4L2lK#QQOe_wT2p!>6WI^8`1%==#&{E)jJ zWexwNYYl453=l3;RPWW4vh*ZAk6B;DiczACKkF=9ofF2GZT!R@;7wO8(1zHg*miI0 z&)z*kP436jI|G|DU(pp(FBMM1T`;OSI2aA#rRXWkv$ZiM0?h#~u?Q*SxzO}!1&th% ze3&oM^oId!F^}D9i!NIyR3GE;4IVhsvZcKtRKVpD9>t@#l6Yd<{}3}%yC)yHRTW;g z@STDOghVG+omA&ZNL8WXBl8F2C{YX{LOjac_^)*o&SOHu8*mEr-}R#H_&nFRP6G4h zt8WH@nX?MiC8dTR0GhnCy*DTp4u=4xvr8_S*>M$1nx(r}1<3^o7!`v2r^jMRj>_Qp zM1k2w*1-k=$TG_pxN`7qo2;OLEjJ&Cwi3;H*AP^b~vFa^I-Vw%EVtK0#kJ07{iJGK61-528#FlT$d`t$Kz{dbwJ+``C1FJu-r#a*l*2-g(?LykYg=Sj86k48W6fG^A1333YGLH(f&c_JJy+aWk$#t;ssXC zbqQD$uWag$0d%sQ=mY_XJL))P9QEmdC@3*cKl8x%c#_-?hhm+%1h;i?oFx)ac#@vH zf9=GgQ{?k_0c!G2K=l)NFa)AN1>Gem$tvDG$whncS#J)x+|-lPK2 zjPmac0#v5(#Y*nqvM^xyTq)-2fR6b+@-q6fuIbjcdXhoFPE}lqi7iVfbO=BZzj@7B zqkb+Oy>TlGo38@zTFq9Wh)s)VQyxc!$5HBzFqrzpw1@)L5-A7kO;d84WYby^;K4~D zbZ)>r7+-*7k4y_L1J6&q!=M9bfG3d)G@ve(5~SSP80>=3otzeHXpQa2l+^wTbF6@4T_KMU6#+3aO$LQOg9fjpuC_a`SLVL7{PUVijBaJM&yae_QVT)j# z24t2d++ko2@hRzxYWQ+e)ggTl;6osN5AS$s&YHEf`zBl^tf6=AP<{E%{b{rr7T`Kl z!0#Nt)2ux?lM_kI^Rz~;x(ZAPYxG;$Jt*?ZKkaMkvDs8lNd0T`xn`S0aZ&+vc zATmJnXJkJPzxG0Ru^B`NW6CiZ7}oKKP=pV$@Vd}vug2~{HL4e)Mt zrvBoz%U-#qDn1=I3RkeCq_I)yEWvZBDpiv9xkLYJRX7*nT zPFhgi7BI7>Bd_KbrPK#&DfQpcx*LOGea$%j05KmT3e>8IuQEmRD#O6{&wb!zkyX8-RxIR=Veno9SyR(tC zt5}j6^PlqQdb)EY6iH|@)0PD*BLk@Ou`+i}Xkq8yGJ957j z-|P)Tl$K(uTe_I@d6v_`q0oM$*{S%43GpMJtD&~J0l0aJtoqi5ztp71_1Mxvl(#b@ zuJ1e0Kp7yxJRo3#4<{P(S`%I8LhQ=C7?16=lJhLe!vc-N$K5tepjAHUyUK}7n)@@{ z%s?mNkX~4(Lj4kdf~myZzd2L@`9?@cAXQpZ*Lwz48pGw9^By97G_QO%FhP86w2=E_ zUEl2jku?V^IpYIt0RWHcf@ zH$8y#+It!7MUG{clE}^QD?XxOFCjv|x!RKHSYljASAY!j*CmGhqpGQCF|1*Sma+Azfgy=PJ@;{TiSyKeBGkP1h$FwCK|K2<|Gdj!px!Fs@6v zgFr*W6#)CRW-S*&%m}(>Xf#Teu+S1GPZIHQp2S0fTM^C8@C|Z-WvOZqpz^00sz<>zr-pFDIB7_OocW#VIss$Gf>f=r-XDX8Xu3bEP;v6Zx9heCCZwK_-_< zhe}w-G(I#+fBob((qOkjy9hMlD)y#VjoH^$KMSv5^61+^>Wua#Y;sV`Aba>ep@vV6 zpzuU#0RyNGG;GZ~p}YzwTUwGNfZ%~IyL6&dMNN#v1J@iA{10vt!veDfiO>jr&8$gC z*&lwm?VHH!ZWU}o0dZ(;;n>O?fb<)g)_{s_7L|i8wuS%o5gz^O4rnDb$=#sami)qm zQWLhjm{CIPusNy$SU22AtkC}S&B;Fc7C?O)i@A^Der;kck+^RD@$1Mca*@s{7)dDy zx^$b=Uj< z)6mW!qLTo@cGqq#pRh%Lfg@X8W%tF+bouzBbkmS-gFIQfWgETvWhm`TI5Ek~p$ALlZrTJx}O!83QopZveb--c38X3IJo>;b(M- zjlEN7j|Mf%C(KLFuyjWB{bhrOx9F|>zib~?MJa?_2k0T;^Npvabyrf%!sjPJQu>8* zBS`V4N$38ox@LDtqh4%((4Rti&SO9~sbMjPU8G)*HfVj{*%PYaEHP%kw|@D}k-h-0W^66q_GGE;=ya1O@45yGR0 zmQxJ7awg^SvB}umJVfqv6VTqjT(RSShuNWAW05Mq&9Fiin7w~i`kFA&QS*IH8)QuW zx~e1U0PS33*f2@WivE-F--R-eDhFCp{>Is9mMjT?v0<3Spjj>5b) zm+)4{K}a95gVK@LUJOXH8wa~mhVhyK=+qhjD=%tppoRR1HM`#9HgIbcF@lDgDRa`o z`6604poekJfbk6$`nGGT(R-2^#7cV9TG8nP7w~jJI}Z#qe~`^7)mBo;SL_@@Z`$0P ztcHpt-2|t{?+;HBs*ALmQ4Sel@(p6qs7r=GF!_UOqK_R5k0+}o5@o>#Hz4EW*<=(_ zIB}6hp!rxt`jsZeqm1!*DyT7Wjtte-KS^y&o5kMaN)uRJrJcYRaw(PJzq~=%55E-J z!fE`JM5|}BRPyM2@P)Sav1(%# zhhCMIOn~>e&e$cS7%M7DQ14afFsQLzlvv0r!zFj`Uf2r)PtR+d@K8~*Y#}F|Q|Imz z^6VXmLyGEX7Fln$qaDQQsI1s1*oXW^lYUA3>FQ`L?gffe8(4ITeEk0QXSvOjWUc19$P5ns zmER#Cn!=FJrtYlp4xSM~4x1Q&6!-bs3h z8BaVy*8a`b0Pr2CG)5B}&2ru!=aSh0;ax|pvkrQ$x>I=Iq{R;R>Ly2cu`<%kklK)> zAf>xPBWjwQPd$FM3>=%D5S%bRVF4=90`laze0m%^i1W8$oZa^^EGUirJckchbssdv z_mJZU8&CQztP2$%?gTZc9L07L3h@m)k$$c zOprZ?(S(}rWx*_hyI$4l9e+c!(?EhfPTEecacaejEW-y6Tv;j-!$`nJC1_1n%YsnjJ3@_ecc4@tj_hH3< zSav54VB>=Y#3=9ys1J2+VQwij9-=;o>|u@Qb>A`$tdl!JEbcq^7v89esf&)W*Vp5=#}ImVps>h75Zcqat6uXn+M*QdPYXr zkD-=tX@sqKgLfd%G*WCh-?BHnvWI{J(gZLpGDbP%5I^fwex!f)saLgdapH*Kk5j+4 zbZ{xW#43$4%Z*&3^an4>jt7WNTLubVQDB(-{YSrZ7R`omNelTVG<|89UYYR8{A1&l zF(fIy%F?BWw&3LmxbBitNuijb@_A5TaFy7@r3eH@uuRS|@|tiXreaT(9D$->9vK}6 z4=&f`vnGVy1I=2YJ%iB58i#|KAEp_{i$imk_&w)K_aG6MvEoMn{rN4Pqeut=m98By zeX~~DqUJL%5B`hvC^EcQrDiEL_0TtM6vt7d5U%WOCsclu3MjRd7-RAxm=>sjui(e# z+*Q9Dk*UH&>`1P;i73-w_tbCpCVf; z_|$qo3o!>?q^z>RYFCG_s|lNmDH1FM?otL0%95lOHNIpy6hj(}N$}1tZRvjjfcB&I-?p<+H>{wD+gF1V=Cr8-SGBFSTqsz+cX+Z=aN zkSc`@jB1r?a2CV51ge~B*h!fNXGEM>HI-e#6zvzW1{cAg3wpK7+u-~vQ$-N-0JBD> z){hVR(whqi(XLA$*S5424rSQJ{ihM}zHz`K- zij}zfqZZ}L{^^ch5RfWIIuO(z>&GOL5dxl1}qTGc&L!SiR72fnC_}-s;y`oK0RK z#01F^AT~y>PH2G1&qeFqg4G8O4GjmO>!;-XssGS}O{% zB`Z+hT(~;B?-JzrT|ah{L2*?~8TGzxiig@OnPss9PH!*wMs?hZKxcHOz>*pj}qkwc72F^QwFj? zLgzn#+8v1w%Kv6~%S>=ZuZ^0GLJI<{6uE_GCRr*DEHf-fTvj#w6u#goxNR(yqe=yh zn{8E+0X9WuPr=jF1{VAlN^otzHd1}tukRsV^4M5IlN^2a^PS<>JdFybLE7B28nY8z zi%&<<*J}^Y7Dza8Ae}XYxooAT*XV`niHeVj$=pKr3yawCYz@reY?l=XQG&KqCZqyH z#R6EJ(GLEt))W`<6dui_tVH`{oSGpu8eaH~MkTj~jOp!jm`zZ~sk9|x8 zWk*t6#LaRWT4XTk*Zqa6jf8z%%DaLr*dkb@J)xYW`JR&b?<&uNAfM4dvE~O5`J+Ag z*ERTDhq_%EHf?W{fP0zE>0~8A4w{9c9(dw4jA6-r)66{o3oOVl!~o55)6n0aD(Y>O zIFrc3MuCli;++#(TAfp^K4VcL7EWx@G_N3Cj#=2gM%DSL9AicS;wjHo`W?|h7kG}7 zrpjYYf#HjsTl-6}d3-k(AS~W(DsQ1X%lr3h5o}umP=2_kixPYCv|_UG;ygt^b>XJ# zYYuijJ)v59>F}tn38f$ywWbAw-A(lNBT)w&1FQai&9isq0jlcu0fL*YXu(pOp-|@u zK~-U*ZyNxWcW4&!?0w%EqUu!M6d?VOxTdV)(Q%lGy$bUT{nGx3k-q( z7z3X$n4m5Z{uii-|9Fk!<@M4FrZU}L0~YPlwM@fC2tQI;+Ot#PAacgAj@Z(OYJO9= zW+Bqe@4o%$NHl7)l-fjrPa~47!v)YcL75X!e1v!* z*euX(!JnEALN`8eu}XqFFySB!S@Ba9G|UDxWm=MD0H(jYl7*_SM0#I9KnTN(bn?ES z3qM7#r=iJ-!%1R0zpTkv0meAW+r?k{oRN0?fLwH=EhazchVP7Eto>vQmSckQP{ew7wOvF2aFHdGEc}m$g816Is-V^%($ygYN$~STCLZ}J4CJ0 zU-X?Rl#?wu^r0JI>7pmQO``0Kgw;nq%8cZ)ed2)5!xjL|&*LH3=AttpMA~E2uE!_h zf}O#!n2#O|brDy`3+<63uK@dH7od)od5gxnrN}S*1GN%f=P_AKg*9@L&rzR9K%{^Q zDIL|mNQ=RR|3C{%OAC8HEVC3M_>J8{8sRpo@yi%Bvp(pO_q4}El)ve=) zOI`(_D$GFV`@9?@ACID>WrcMgo5QX@bNHcN;beri5X~OVUR>wuqQk-cSX@Bs$3RC#Fo=m%C@DoJt-QEdLsn_I6N@e|xC`G6|p&vVQf6lsF zhYBM3z8)BO)_2Vh`-)ay{k)@nRG@^JfyF?3SOV!QpR@NDCOc#D!oi%Bx}2X*lHbi8EOU}AI-n9bYNK`jY*wC! z=8Q>45YAX3T=c`#Pm1okqBce*qY)auy-51MaK5`ZKr#clE(f{MzQBI^F5~nPx=T1> zd>Yi+;)herIJE9*cH`kS9fyaWw83>+8Crn<(IWcvFy4&X$jH@#6hIZN_7w1>O_efZIkS*7E-6_ zee0=)#Ry|?>V+p^y--kIoZ#`^&RQwPf;TuA2=>+%m8TI9Q-1emo5-$$S1eGXA5vS9 zU*AMyWqgwl=IX_PvUwqI_QzyFOj2np;5*6{8huSbicxhgDtp#}Pq&ag41O~Eo=Ft| z_pan&KfEI!$zYj*42GNcNu2`5UWVA>d&K9^XfC@4F0Bfx!Q@&V2FY7+R(^4HTHiw> z;yYfQwRTkU-m^?5+5i5@ot_(kpCH(nrIY%LfFM0X9?A~X0E@FXJpBm<2@RLC@&iToeMLf9fQF9Q9xN zH~%zh)>dH3Cx%60TDqJ5cNdL`Cvpl@p(Gy|R4jS_m|M~DYqGEKsLL64J7qShBPy|0 zSiDj(T`+_FynNF$WQN-ER(>iZk>5u8L>R7>0q(2NG%w1z?z}Vt2Qd6|qWQ4&54Z>H zy*vNB(r9l zJJdmsI(pV)pxfJ}jbmz^L)OaG^4c-0z+kkM%sZgGtaJm_wgm#YXg8`dSO9>XoU*jr zTOuHoueQb_Srm^GMaSF#uNFq-><3cQuwYy|@%k(Z#JMwxxO}zDkoeP%m_~VD?02IT zsV{@3*lxbcd6wUB1tn^|YBX1E=1ieu4ciQ~ToAKuT{s@$!HBuUM`La%`@*2>Fq(|+ z#B(TFl=zGJM_r4=YQM3LG37=Ft;}r6`{J4Zg!)=` zeIAL5Zdus#NJD@NcAg&g3+s;?0WX`ac7*2Lxeuq>4hC6^gw>qD3Pdbc?ZZy)-1DQq z_;vtvAY|fhTBpS5M8rfyYja_>N-|m8g}9lc+fy+RZ+qV0TO+bAYbjI_;I`4d4P<uhC2d${NX_B$2&2xXN}Tag!p;oAH9!Dc4~S+d(n#ohUYQyzjxQH0 zaBw6O(HECRfiWKHpg?KTVCBhjpFP}JM^>J0!g7=X!VryW5wf>`NmaQ| zC->A`8I6Q$fCybtQK(CX|3f># zaJY(3r3y7fV9{r~Bmgj+MtSKY9EaxOfv@r1y#j{&qly;TDOYnT%&JK7H~IHzU8uip zB1x&PEwM(ZjRMDTvym1$IE??^S`xuLdMkD;H{I24xoGv-m?Fw^g)Y|@qb9(l8T3_# zodLFJA2nSu)r|@Ff6mjpioT`Wn6xktmU_UKLg)U<{=JRNmUEI_O{wnmE8-Z8u@A!2 z|G!WDZ+n~(MGJ>6+*;2h;}JvX4||{G6j0$|*PT|xYqwP&IWL3zns$9_Bp-m;S=`Iu z&|X?Dz-kGeNcm1M^lMV!nO_ACva17ArauXrK^A^=(AqdMPuA9-hHzdFfg=aN`|!vu za1NUB2QNm#+mGh{Q6a4=5}$=0>T`rwL5Tvk24#{GMuV+0Icgv|H=bpMXNIv2w^g%i zq7bfEeE2pT?eU%4oI^r`!BU}QgpLxT9&Causb~fg%}@)>7FaUhrU8=092d+;#l*`_ zpz}|&v&xgalYE&G!qxz*OCW4z4}qSvUoDoaJMhDW+2g>3BgxyKxvY zo=?~hp7%?_wPI9%U%7*a;q8-x#aIpkfjRhGxn+pNH)4bV?W&!S zUS|8UEAiDQ7)1F_eM}1&WZ8=Yhyog*XA7j>Jre3VsBpMSt@U$p?u$+GNuQt!6*^9WCkKzeGV@JAUhO9I7{DkoIDgRVjV`20u=s4);dxy3=n2hXL6ziN zEC)PG3`)V78#<5~{RBFfdb)ssO$85DCtIRR^Wx0cMm6@1agKFM&{O5hkq8tc1t7|G z-ZnpNcrMBqlZK0{6lUs+kmW-DqJXPHt@@+u0GEVH1KE@X!ZZoi@Ltt;a2Q85j=?K_ zD-0v#I_Z%0Y^NFkiv)b@m{6&1f~9hFzDZ~Qp+44oJbrkp8a@|D%7WP1YsLid2#ssP(^hdD<%oNDB)DR5>PuByxL0w&(!v$@~AT% zFlV6UXv6Dgc7GD*!m0mfzdnEi$Q0+TMF_J(gtKuHXyW@FcNr|A}n3)*~GOM!}oXlbv5K(199%wXGQuo+R*W;lU z@ne~?Dn97@?w~6j4=(oDgSZH_tIJUxWbi3w?{TU4?6ZtVNu8giVN-c>au4UE~od-RZ$7B@)6 zbpcbq6!b9TshV&za^s|HA8V&0lXlwIj?n8I{~d&R4!a?bh-a5@K#`EBDeV)6Mdkur zfrZX~GZQBr@K~2yxEm4%>yKj!v`iPTOlqXeJhis(Au8VxnttlKPmnsOTAhi;d*sG1 zyud`~v?AV~o{-YO9pLr-hG+SiQtBx%Aj1Ly6$FW)uc?mF{2qnXGBnb)au$OZYoU;; zrh_c>mtNG|0oFw4b{iK%vC$$~Aruk7s25WJY$@brty(TGKd$0pVxITIaEUI)zuzZU zF}KffsBU~=weGVL_j~xduB@g-GNvf<^4n{qy3M=P@KP1i=lCZUOrL!Da{hgBu|g4&cw2-59J!_2yfiA5UTn-oZiI~M9}R%NreDo7B{j_p9v zzWcAZrn>h{aX^cmDf>^DU!jq{@a(#yyp;}>Pea_F=j)myT2P49k+@X3me7t2;3$h` zr}cR3{oyBjR-Z%2i2o|Hiq-rrBbd%Rtj|9;EIzUO$hZ`|v%fTYCRMBn1Txp`z%6&? zh75NqqQ_ZUDnR=hAxjAl@+fv0*K5)?QmlSyB~bb)sMB$wDT#_qE99!2qrO)>-EARd z;z3YaXC-q*kfDMLeFRU{fzP=MXozFXYD?2hMV^RLS$6A46Iuzn;G(=uKrNDw9N2J3 ze9&Ev#p1AYX%}^Yz#!xk5ZqT5DgMns7IUn1obB17{|HFKxqQ=PNgJ6tGl96=wK_CF zT23e<<8#_XUBo>C974ej`}URug-}Euuo9Alv zhJXdayd93CE8_Do*La4mR$lW_F2%x7*l<9zZw3UCNH^{@=KMg+jqF?TUvfu5nN7Bs zDi;CO+xYc#A-PZhd_;jfg}_rQUcqlokOW_7ak&F1r+~CvGE&SjfjsTf@1DHPoo7(4xffnSBT*5eAn{3N%2ppg} z0c>|?C_aJ;L16tx_UVZk1WpdFMgszE@8RPRkBwbCU1rW~v3d(kn6w%|7U(tQz`6($ zP8uM4sCFoT54s}f6m=I}`GMd#=DB-mUIVlSq{5-DE#2e!&qV;$_ero~qqob)K%gO=vx?6>OlZzc zqf??=W@(jkg1{b3Q<11OCk)h0)IBppo^~J{-Vx>Pw#p5~r%jG8 zJsagd;ES*eXtE28?%Ei9R?j#F(P+IIW&hiL3g0h0`{0cQLwQeTJChEqmFnRi6v+wZ z`Kvn>L0Y{vM+42O2JGe2{h@64LRkv#*S97LJj^03{f)+ikqb!PMC)@y3=Iy$>UHzO z3d*DIxaZH*Yw|ta{$D*MVv`!zWTf9dop^>w7~-PQ#}h|p15NbBIWsuvTMG^Cw6f8c z(@N|7oP+ap(wfV0U?3UyNyV)No~W}d*HeO9Va73gLU-RG_q(jY^-xMAgtykiXp^r> zgI1f;6z}#Gi%$KV7lm}~GYRE|xZ?onFK?(}Fq9dvUkKFuIi+?gF~D~pv?Yuts4b)B z(Fm{c81v>7ZPDR<+*15>3lnj9c12nZpAYjo8n?itg+T@LOvkrtK)dXJDuToBD*Sq3 zw*#&4ZRJs!V+NKXWt1{BonUjFVI4(P)L%bp@E&vOT$+ncfAiCsIuD}NtAukydq?=B z;rzBehh0C?o7+$Wi_laL96*0JUfb@=^FcOdIjVn9ICCq1i}yZkFO z#oSV+z|4+7AKmE&%#5UL$$6gMGpUd8<5}9uy+fzCrJy z3ZPL**nHUL0=K;>Kp_*OFi4tWiR5YmBs4UR(}YoWR-cJ?ZlMFLEYLbuARO0Xm~(ar9_HeB979+KMDF2&Q#Ly3R^dCy3tKo7ELb4(%2=R4oB z>;hjRj4cgdyQ!$@z0VwO4q~Vk?NlP{)a!5pih$fe64h$q1|AeyWXob!x?!{m9GiYVz7wI{coh|o zNvxZB{mz0?-4yh^DB-<>!Ga1PDzxl`?qW+6m#qc=XP~~N(P?EhAjV7x?&oiafVFx& zS4Wvb<78PM*S)Fr$hPxH*j>2^6k|jy`pJX7qeXRtKgt*tXd13u?n**pO_R;z4O&VW zr`;0@;(nh~PvF&r?sQcdbpI>=&^%~*--=Nkmz_Gs#4UMrRt&dEM~rzfYG+(2BTHvZ zV=o1|Pf*$=J}OxN*$m%^ve%8^bOZ(1aZf;hFI=!SKiXnoC6V^af~||~nc~pT5#G#h zTtJ}RLpC;pvFTk18;q!F=l*qs6rg|7wbe>_oy|YTu0C)JLq{cZF`OFdGaf zAGy=N;@{+om4m4qq_$GrCDe|aT}epWfxl?Un7BXIgau$!C*#I-b|XbS-k_`z@zh3w z?xetMEQDC7HiZq$8YI((aka4;T69fd2Zd1yIUGIJh_Ej)z}IO94s{znN}1))zh1sU z8dUxb`3}Nh3KCQ)6gN+I3=B7U+9Hd1A0PzR3MY19kg5gx;EN2xsYDqz^ubHM|5t&q`h*BsXZ(}@3|&IP&wj$itg=CYOidvQ*23r3zJD=g_6wU zY?n(-*77PspdZ$34=+Z<0cE_SrGqG=gV|8R;yW@)dTA)J%LHF@O(YezAOFl#3${{M z)+_Umy`H21RH`E*6W1m*hW^O7;L^QE)8bmr-HMOz!I!JRLs}q5<9R>5TnVDM1| zPJ675z>Q4uNv9U%736#eX>uDji%{eSI|n=Cj*)%D>b|^#j_yPr)ps;`bzQf z*l6nv)ZCd#MzhJslm7f7WW2;pfy3)o1-VVEk^k7uJLFgV>IjEiZT5FU7fXo04V+x* zvBt3Hy8)E#F2pMyf;C`Ckfu66_gp%<8m_|uW(Z=l0_8O+hAMe5y=XblqeCY9Le6t! zT7ji)C^9qt&y?n-#CVFZ7W4_>!m)?4!y>InCE|yHekHSTUdaI>ZvY+3J26LYmr#g6 zG&1_82Co0zUS5OL`mCoh6zU#kJ&NY3BxoXGkI(>NAROQ(ogL>qP#zBlB+eAfE#(eW z+&JVlO4QHr+?cB{_ynu5l>-Qza`0C(v_{*miJPM<)A#^{*cuw5fZf&p21_e?cpYW{ z6G}#8KYoXd*0^peS!mS;qOQ`2kbMjQGgyl&MaL|ODj@kN*euGuWzV+gYC-N|ob_T$ z6iAQ=ESCeV6UYi7B@R|Dk#rtF>-Y7|V^h+^39OcC&rvE;2?KN}v0RbAnap2#Y2Dua zi$hES1z6$H_xCZWMpRz>(tA%CTll|)KyHi zAn+3Jm~0ReKNwir*(H|biangm9>HX`>s2z@|IY1kn|S-dKM8(+%m`)?1JE(9Gi05P zYow)(^J6ItO8z+P6}&Z-^10HTmTOS+M|bpv`zf5j)WE%_gMt7;3F;)%P1@>KBQYOV z^s{KL4N>*Da{a>BwQv+DMIFg-xY4TcQiUuL9`G;|P9?gHq}C}~OvJAyfQr$U1K>{I z+GKG^XgCeBPp?67t(cUchVk?F3!DHaq9?Uf%VX47E-zfrc7C|})s`1gD`;XLm4H4+ zhPN~bkJqD(nB1(Y`MGLu^;}I(CWHCw6XSkNUeZSVV@17c*7|JG;B@dI%%+6qbKRg@ z0Jy@BqUe|drNN#oxa%_hu8nD6w=b*m9jU)}qA240!l(oX_BExfY8j+#EdVT;df3*teaYn533pQ$$q zs4czt5`B?TGc2}{87@+oBc$}oyBzmc8W~fm%QB^_6&p52!H41jvrp2#o~|)1g{=*O z)I&9Ldm5wXR@-+9_$wx2d8gn&@M2l=sdSbUP!pXKw(?tH5ovLlH@_A;+pH3^>`_ky zmUssSB!XP{k;bxbe>Z}1@$DH3Wk0(3(yzOm${_eg%k<@ z<>A53CCX>HKI0uf7dL}eoh50+h)iVm`!FfS^YSX}GS{IlGl=e}vy?dXv%fJ&(GB5( zal?l_E_21*g4CSvyeGCOl#q1ZojN6?Z&(n*tWtD8s!O|_DWJ*B!(7xp2K!ZoPdw~U z6D<_=rGae1*uXWn$+LkKclt0fe%hBI42YYgC7Dz?5v(QUYI_;!ou`xlBBji~7pmo>F+CoMNXr-+%E+!he{P_XAef-t z&l83GTRQ((Yh*dfZKtOH>#$G#cvSlAjl zE$*UnyC*A9)0LPz<%rfG;!t;SCtqWM+NNdmOf z*BnFll4Ve7dV@^pp!9Y`9s1-p{yUqGJ`7kR%rs1(7~x=-SHEwMqW$%&9X82KX}h3o zhDWX;JNB3qy`N>bS2-p86jTbBj(3a7@|q!7@S4n z=h}}qMrQ!`@tB|Z`h7RO3%Z|>plVmAvQCGH96Fp{4_4f?xEDjI?ghL__l^q)O;537 z6gtM)z(w^Rf+`E>m(vRAJ*`!GvESQx|9%c-olX)pfZ((EypS|+&&M7c=9;zMbs zz}$NcT7e!4Uz9_Dfqld+?*tbV4$d-DK9yRP@SZ4z#smc`#6&be)!S`?%i7Pej9@$1 zA*^9;xKB?UC^w+%cG@ckpyvNC6F33nEa^#z5V#Z!)4wjNrx$P7MaHQam&oL;mr*1k ztvd~c`zb&_)J+wTVcztzI?z-IuynNHqzhQSP*G}B5#>=t{s~%XwD(f$HPL`bu+qXP z#*u!iNhM;_jhZ?^q5|Nh}oiI8CzSusB$& zp~SkU#B~&AD16}&4!F|v$0U#AVBT05aF|yU4C3G{V?dy*Nbc)aPQ{hr1G86YP_OHX ziDxdmZ}2iJOn?#%=ClR3m(KnIEPJuup#+p8?rqM3d|V+0QS3_g-uTc*Np_E~9xc#m z&Laf;MThR1j0njFFDy_X=;7HSMFeq46I45QzaH`vXtC`}rtMvm<7tqW=F`Z-nM1@-FRqK)W4pBh%a$N*Fzk{_@dS7%DKoXalAwe#&%@I4 zjwrmVJ~v;D#>euM8a{GW#u{>4YHdPh zhC@$A=vJ)75mDE5`O(cU>V{F%{5TD7P!X+ie7@_@vyYw^yc8aaVF++snjKEGEfNbs zG9A)&f!3ngcKH@obN=b6i~*xP*4GH2IR%teavw~a*Zy05(&UC z;)O-&q@b%v56|{!)zReHt4N+CVP|o4Fdm%4#l5DB3E&0O>dIr=(3s|?H4I?^GrCdy znDB!|k41|!z8{skcdrVpg_Om2t(Zy3gJUd_5*Af?1nA5d4`D?nF)_@k0c}LOPc-c9 z=x1h#AieEhDAupby|^0ELr083A%pNM22)lwFj6^mgyh?WZ>cAw@6p_H=Y6TZ$p;pi zfH>^v!D193!xC+M98r6~qsE5)Cl#FXV#KJ$S?}PJ6hq`|QFUjSnMiDZ=X|KnE1mf& zMTx$8VmylbLfj&WXzpLSnwGF@yT3}O{T|MMqDA0&ci|8?gR$O z@)mRk4e6H%D59yR!-W)LRlG2<^R1o$kbg<}J;~oSwxcx3Bc9KxJD4+YaIt5}|d3@S@ydr`b&Lv169r zt^sifb+|S_jCfgJ%_=NF028T?6SIjc`uUIG!CJIA90(171=JbHf}4%f-h&!nf2>-dytoTC*84I#nmX zHSbr-J>InFIHIGqJ)y z78S4JQ`O*P&lC9$#^Gr0)YPAep~2dFSnrAw#R>gWh*&Y_3INemJp~UQt>3nfsVPE5 zVhtk)5+F3}!V(BsG(n^&fQm!PHG_sA{grX>wAS1&*uertmnjs$9hMWB-coNON)K_9 z&K7h?4E1GD`C`-MFH%e<17I$3q7XxR`YCqR+-9Nc8$)Ps{IM>d2@^se#DQv35p=Na z8vWN%4JI4r1bdMq6;Wp*`l$c7Des2Wd(8DrRMVV5ej4hX0+j1IlwD5+kfB+kJ)k?|u_@vBjV^Z4Yi+#_2{+-fp^tMb69Ti$)?gGL1>3S76J` zS!8c>NRDKTG-F#PQvAab``JQZA19rkTR6C5G<5lFa^~-KM zm>L4R0R4tC2ypVkG6bc1@gIu5QF}!7jdXHLq2fwbGT?m)8~o7PqaR^Ft)=l#H|eBh zHIU{bDnt;(H-@9DEOk&4jEHFc59`+k!wJ)pd<#URjusrrU3fB_U+jj%rd?ar7y;S@ zk<44Fvql3yX2g^qW^uyv3V)?<;(%<@syDf}a5l4wgK{l;ENG?A3!#fuF7Z(Hm6)U_ zl4wdWfS_7{w#qDi!|)l1$2d#5p2kp+Klo}k=3QCJk5gaeBh^mV2E$sNM_vY8;wc&S z7EpSoh7KVw7y~uhfu_c&EY>HOgt~#a<~250d$B5eL)*~0wk8i4xJBW@TZPZ3IB{z^ z^JJ#h0AO~_@{ij-zUY@3*|V-RD#v_5O}Y)kPHgiLjIn}s!i5kQQ{ISHzT$a3yzF@s zRthtIEm;t92?m*A2D1Tb7Ma{XN^+m|U{XTcnGo&(KQzol1F%2t>sL2J=)NB;vy4qO zO$b0#m4iT{0S?NDJTn6T%HXzCY~K3ik@?szDlYukeb5X+MLPrNkoZRr1FJ9ozu@tM-smzhsSXB9$ z96-VJ%qof?ZvUD{wgkwVLM_hCl9p?8EUbfls<}nH=B%qUX81U^3Y%iCa0Ne4a(n@% zr76Q-jj3L*ZQ`>DsnmW9iv~&J&_P1c_fzH=#tlPJvop!}PEH+{-($7>1i||ee+nn) zgb>?a$AYZ#vvvqjOdG$kFhsrh+b5byI;4ZC8>X-@?m(;nSV_D%%-dmC0pCX3nX=W} z34&GY7eAki+{mOXA7pH@sV(@u$j?UPG?E(0J*W?n^BZRX{~4{85v!BfUe2RrMlT4uhH;;>por$tvL};NDftU@{egbPi{ zJPNUEw#p&h6P&XQ+J!^nhp`lfc2%@D0z2iHYhw)Xw0e8rnvErGpY#zciLc=hL6Qte zUJ3++$yfq;G4YOFzsvcMvbt3nR-cvxd7JKsqw-)-0L%yMg;d=utcnJUOlB7+0v+)9 zRgemyLU!MHXF#}K5z)F=)JiZ0t?x{uwf zZTcqb>D<_m|92y(p$0@`c446N(?WGxxD%bn5AjzN)dr%9xRN*?rIuYXSZ= ztctvwPOr!AV30Kr|E5nX-%%+Q=w;l1Wu>jW29=IK{_(M<0o?p+%w0nJECQD?$>4H0 zzDJh9jn%=0SL^98iGRdTRC+fKjZCR+-KDUCvZ^DGHWaci)v}u5F0lf%wwFCJt|Dr_ zXyL`$JM&45HXQ`kGTI7q6E_|Vd5lj)p~vn>Bi93CmYyq-y{TXIA8te&D+nJ%8A|nB zGSa?Xg1={8psGc}(bBN;*-YO7hhW5zAJf7LhBg;=mQtEgIX3i1tyjBKAxe`J2<2^7 zx4M`HnlNE;?dho?dk7V+Gz}DgPUpSF#nfH!_XteJ^+Mpwp@g@pq10tAaCkFSlu2d7 zOcjn9s|@27V!X~$w|LjtHwzedZ)Y}ESDg#5`y8{xR|SkFzw7eLO$19TcNOQy*9!6!n^6>#~?)#&0SE$G!oorp2e(Epu)5-rDWHu(dcMvFJIv3F?j>~~4evBFRsP8W-w&hyWs~iXzPd2p-fIoWZ(68o6&If!xD;^PZYHr8>_=M)DGX=h86ljJm8YSc43_U0 zdYd|B)C(1ZZmj#rPE@WD@Sj=LVZYc9UduOnVOOJXiOg9_qu`S*|L1r1H|5p>K5#Cv zi1&6E?jq|A!t^E20Vxw#Hw42-R3n7JunfY%Q&T8NYXEi&H;R+dM=$cYW5tu@Nok!d z3m~*f$}3L%_>CHGy&EwTay zy(STl(olg+5r5dgVB^Q-m=qX7FSZbL#dOPwMs|V@4+EwI18j!d>9hylb)GI~sU!fI zl8YvVm@EGKZ*LeGnn~x8yYE#kRO1)u?Br^=Xs3-TBA=)d0D;mSXqo*F4KeA`#1bA< z{nOzk4*e`ezn;Tp7(oID?4}WoP>1%KjeE;j>ohD{T%Hjp4v@I^yy!*-?q;N%>=Y;0 z^s_iGgu!GO*7i$pjHzCY0-_5oJYy6{$Ip5Wln-gQL%_I=Q`he|W_?y65A?H%a@7>n zE-am_iI_nQ{6a_dpo=;9;@>wdgymza1M@FSXePL=o#5)(oea`tm!ia+_RR$XF|j+M z)>E3SE85@tz=sS%nS_40G2j%BM{dwwRV*LHIzdbQxW%auEnOs~K*O1OqiKh?!X;63 z2mfz4ovF%!-uznv$4JglgUA~Th%`o3ZY6ltG|$4{f`qQZC_1w~xJM+lr}_F=q#6_$ z*ci};2SvZ+(TeVp&e?K!LCguH6rZBw&js?Uc9rf*5Nxa+DN>%drC9K%;27G=vGO9q zwkWJci9_RWXlA4v2AOsTdSpIDPwXMn;r}!m_pSl*qH2APRcUS=-j7V1gk1iJG5)GA zY}-N9q(CtOe38N~h#Ry_0A3D*9T)REQ7Z(>;V6m6SPUSN@}aeiJ0{Z)U7Esc0zjJF)Wu0u3$`At#S9=`?INz|VM1R$#mz)61l!}Hb64?6{%SZh2* z!L=>Dh%!Gvu)+pcgm46kpozqiu!o0|cE%f#H( z(`9^E3NqHmeP%MHAfZBn2Q!gX1d$7$EKR8Vk}Ce@TrhMcp*_WpSl^sSWC*`x0mEsi zn~?aNkyVF<<~7|775xAU6<_YQt0k*C&k-ZRkN#xw9K7(XtYtGPc|e`D124uZ%=MFv z1BSNdU9AX>T7PuHX0P5&VaPt0Et^YKKnW=!`buD?IEPU96Af;Pq;%Ug=)hFDA;mVkydE^;GdY zy1s{73ky8sYDOh zu?mza*~xS_ccbj{{RuwklR)Amci7|i@p#bju&%M z>|mQ`4xIE1QQIj>$#O|C2NsQ ztq{|IUzc)I*pZ@7H=MX+gMJ#iQQxer1*11Mc|hFOZgJ?hTS;Kg*e# z%47)TI1n$lAhV=u1(2puO1DpgbhC#IV9n`!uSSI1i-Z869u;wwdBf$PH*oYHyy^b` z1={VkUV_|%mjDFr_CV?9HdTBYV%E;UwW)~8CLHW>1}D_!Ew~741Vm=CN3y*&Knyi4 zscepI7yj9izF3Ng6nF&ZQN@BbF~18UKI;+)jKD5T_Ilb{eOJUIh5+(2;;C|aPYyqC z{QPc#&%MD8JXP?e$rizVR_G%L5;+b}Wd<$)yPn9<-VqrmUhSXY8X1$ggu^gT;RUKS z_QAbv+{kIIBF2=o?E#2wVe{Mj^pnT)cgRbV+U1a_O^47y!pTL+qr$M$Ia+Jiz>V+L zGeFOWiyVa!Izsp}Hudr*-gB7M^QLzTZE*7L{#w?3bm!IXyvEFIy%yyXjOGV&}~*+ z`Sdsx;X){(8>WnG&A|GlWZbodMPvhIH{{+J95Ot-kpO`3Jj??$i<@zLP0wa1F@Gb& zxBG7sQ<2E4AhK%wi^k59wm6AxG(0#{stDwAIy-@I!83iloTTI;UEw8ILJFlH%lqtv z7X-xrlttk^({||XReq}AWthfMc@uqi%GumEB@8GZ`ht>3vnAMOnhAm-X<%nQxV~d* zG>dBc13mwz<9!+-;jL|mG*xgmOn=sUh7Gk3mxY4RAK}~}K9*w+Qkz)#1UlFZKw0X} z?{U}?$`g33pc^a}AWVQlK8*1cYB;Q!$!aL*`|YQwRF8enAuN-diHXZuMZ>v&CA%|M zJ5FB&OQr9QSyqqxSu(i1Ot)a+pp*!)y|<3EwRoo@Vw$#oy_$9eL12_1iInElmQL~9 z(|X926cW)Cjxvc;KVX)FY}PW@Q*pp|De_X^eeZ2<6bA1`k_FIuGSMVAzS?@T-t|~r zNeoby=usZeGf3M#HR7p}o6Q>vnY0L}glxP5{*VvPZaf7D8hj}52s#pghe7Tht)0af z)scEB4YYg@h7~(O56oL^TQw&**%vEqw`Ekm&h-2I^lA6A%fPTppwDlxRUTm=d#T{UnX%3z!V7@T(-*)&&qrcrWRXpdd z2Z&w9IyzLNV3~Tkkp4n6bWBJRA2U85V!NMuJ~NkTX=@75YOxN|87O>jY)*6H1ZBkx zpH|EJDZ-V~rjComLrSfe(mkw?!YI$h@&=oBldeVHvt~4U!&^6%FJwv}+-1T1?<38Ovn9t7EgRIS|=)}DX(!#D;gXu?yM5Cd! zgx%G~XJtl#Bgp`j0@>4fP7`v=J_RvDKdjz#>@A)$0^J_0{Yi63%9XZCaDte23;{nG zKL=;yiVn1>;INkgr4n2DJoCDUqE>^21>xi#yegQ7LRpkRqjVU-m?setcFhV^D|!92;}rZt@H^&0If5FsO|2ly7;GRCb(p=g1S zv%W!h2Hj0*E#?mm7JxsgcN(ID>-$V;aT1Y(1%BQ3^GoABv{x4B5K{8-SSy-u5NJ`p z0aaI|M9Ix+WHwL`aF<4X@{c0kF zE2$eYb4X%qxlam$G}|5WF8R*pbP%15Gqb6S0SicDg?PJMQ(vCF#&uY z826I?xOfCoC7xrZ+F~K9tXXc5=F&V-WE{T%0vLO?vFDWsgNZ}b$H|3zGbIVE4K2JCKqIGgyv*N0A?{y$Kaa7p%X$>WO932i1Q`k)&Tw-2S_)Rw%9*pRyeCU>wubXuEnB}pTfW2|eDfAqswie{0a z@%-@I;N%LL^=q0v9a=gG9|)dxcxnELp-CHT(LD-rgzYZK7wy;%e&f0eW%+$#kWS%07PBR;xmgMvq5;~YfzVZ z!K#nO!YGxPu|pB2FR+tG{%b*^?VTo)AjCUM;C7 zIH4(XE#|0=BlcF;=|Tib!jNHFdx!njJ3hM)8ygt+2COu$Y3O?luR5nO-#Q-k#5yfG z)1E}Wy;gydK=arq8qjkDcmDaWEa*Scf6_Pkv}Vg_RWsXm5f#OYFAHqtj^u!2ur%u& zBk2zTwMPKzoa7of5RfTJIsnW7hztM>fJgwq0Ki230ue|2|1bZKY4?-&;GLPdq|D6h z0(kRUusQhZzxVt9-H1&AmI00dp#jD6ZGErIYQU@o%u2wlR%T_*I>6Zc+OO@a0J8=# zYn54}W(8nYs9B%BPG2gWG8Ruuo4!o5-mKTGY}VCS%B+#{ZIo}K%vva~8Yr*YC*M4o zwNAcqGOKMet6iGaEX`_~%xam;YM9Jwm&|IG%xaa)YLv`slgw(8e2Zk(AepsCX3ddr zUB1T1*A^LDrLie8wnV;0>1&9L?U1h-^0h*~M#$F$nYBQ^0rKsSZ+?91;~O8}_V}6} z-|}d9%-S8ZX2-16F>7>uZH{kpe2e279N*sf=Ek=+zOnIbjc;mvOXC|F-_H0p>6;nf z%J@dcw=upZ>1$$K1ucv*w{FaLV;UG@Zk?F##C-A1i*H?gY6@y&^EO?+eG!n7r(YD!Gil9;L?F;zQas%FGgHyxNNgM6)s zStH^vTN>iL2+^elF*YE^7U{S^8r!3>{V+Bk#@55wc(^UM!#G9I*mTgcrDuJ-YKy)( z`qtB%TAXi*NSfytW=D>GFFPQDS;Il#aJlDJ~0+do%lBKW#YTUSS4mnVpb%^ zOVamwCG&YB^ zi^k$G_J*-GjICiT4PzCJonf5InW+p{qQ-D#3PTfpUto1%))r=EVb&F9Rbf^{vnWGm zO<^nwV^0`+Xsn?tQVU&?O6ZDoDVpj6W2&z_)j>yw=|L)JY@o4#xKLe?zU$FepN113rsFj4w0xDcJxS#TkmT`A1!=T%L3)e>H{&sX_;b5e2oUd}y1i)u8x2tFa0O`1boTV;=d*MKM(&RJmP4?ihB(h}y zR*s6v3%uMoIG3dFiI2&NFROeR^(6proYKsCb(NA(D?9o0rPBwiK3`I4lT*G#53;F) zGaMw-cijf7F*h|kHhELGZfd5RdeW&0fXb!GYfLugYP^`frOZmo*imK`W!6x>pnO01 zdh+e$%gH8VFO9V{R+F)*OeV8pGV3L?S~82uGHWHXC`YAa)=9pOZcQbbs*(JKi3Ui% zKJqm&avk|LLgv<#k+F-6t+bL;MaCxbQz@OAA~N=nuZD~*gEjIm&h{o?Dzw~H?q-z~mce6#ps@mCz9QR8M! z5;1Er+@V`{=%zcAL(EDcW*NkoK#Un_Oh})PX8FS`eVAnrv*h9K))o4?Ldj^%9CFbtaTxQ4S!n~ITSsW8Ba}4^x^;uTZcx%NrlK)t7*mEZ zV;B>LF%#trpDuj1@X5mG3ZE*BiD=9e{*owso-kTDIeBPILu0lXlhBxhz7#ZOpfLfB z`DaW&W15g9WS=qljJan_JqoPmWS;Yrcn(nBIX_u-fWEVnBz%tWInnuPMknaj3A*V7 zRY~MROI@I}lXX5iU&=XON;$JqgjpG9R)zqm$?4Cn`}1{w#&UjcouBXgEOjQdM6)B9 zB?zBX*P~n4qn)ltvu;Q@SEYP2E8ScP`N2<7Xk4G!T$OHJm5#b9Wt%TOn3WwopIgW0 zDaYp-_T0KX-|a~be##9_PqH~ZIhAWZ)yy)@EYZvw%jLOsc?RI}PSd2pJ8r< z1oP#WS$g^G^2z0M%cquEfX1i+kwS;%|oN!Jn&Z+h+g$!-w9nkMZJFM*2w8GmEzZ;4?&i z#vv~m@XsDAy^cw#@n()+OGNp~jz>B_T<0lhCz_k;M>UC|h3SU&nQ2$gX6$5HAYb{D zb(%(aU*O**8tEWXo<)W}3^Ci0+&K=&FgA&QyTkiEUnijcL6ll|J6DTsCSFY>uTU59 z3U&#g$+TtCA#;z>e;JUOsbtn?WXN;0KEs3-2nYlK1{VqKO>&M9P9*&<`p8{tXX8#^Sr>x;H zU_6HvehD+6e8+S?{C1QbTgXZW8qKv&>iQCRuS6kcnuZC7T!eu(F({VEEv|uLE1$@i716 z*G59vIiH!U`Bf-uUcBnNQ+=2#my{q(%X`93N#8VFQ6*lbdQtLzMZNz%KVLY9@eLw5 z`@Z$um8-4bhrf{FHeM=C7$E=v0Q&|206_);0M(2D0J|av0HW;x02mGe00RI3006P- Fl8@H`rnLY7 literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1164-000/manifest.json b/tests/golden/WBV2-P1164-000/manifest.json new file mode 100644 index 000000000..dd79012ab --- /dev/null +++ b/tests/golden/WBV2-P1164-000/manifest.json @@ -0,0 +1,48 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1164-000", + "parentTask": "WBV2-P1163-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1163-001/manifest.json", + "sha256": "fcac7bc15d6302bf018578cf7017100b62770a73ed09c75cf2154e670d489cc4" + }, + "plan": { + "path": "tests/golden/WBV2-P1164-000/module-execution-plan.json", + "sha256": "093b575b27622606481259304482e1e63970a28c642f687c17e84df57d683b64" + }, + "report": { + "path": "tests/golden/WBV2-P1164-000/successor-authorization-report.json", + "sha256": "a959f24ae68ab37b4d18051b1106c4ae6763a44ca554a4db0a3590524c999fa1" + }, + "status": { + "path": "docs/status/WBV2-P1164-000.md", + "sha256": "5a905d3db60d815249b5a5452a4321b29daa05afa677190533c17ed1f45fa8c9" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchSize": 3, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 526, + "dynamicUnverifiedUnits": 3219, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1164-001" +} diff --git a/tests/golden/WBV2-P1164-000/module-execution-plan.json b/tests/golden/WBV2-P1164-000/module-execution-plan.json new file mode 100644 index 000000000..2884232c4 --- /dev/null +++ b/tests/golden/WBV2-P1164-000/module-execution-plan.json @@ -0,0 +1,8824 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1164", + "operation": "FUNCTION_MODULE_MIGRATION_PLAN", + "status": "COMPLETED_MODULE_EXECUTION", + "authority": "blender_main_source_and_existing_hash_bound_receipts", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "reusePolicy": { + "completedReceipts": "reuse_without_rerun", + "continuationEvidence": "excluded", + "duplicateValidation": "forbidden", + "fullFamilyParity": "never_inferred" + }, + "verificationPolicy": { + "browser": "chromium_only", + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "failure": "keep_module_in_progress_and_do_not_advance" + }, + "modules": [ + { + "id": "RENDER_LIGHT_CAMERA", + "task": "WBV2-P1100-001", + "owner": "RENDER", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCENE_OBJECT_MESH", + "task": "WBV2-P1100-002", + "owner": "SCENE_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MATERIAL_ANIMATION", + "task": "WBV2-P1100-003", + "owner": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NONMESH_GEOMETRY", + "task": "WBV2-P1101-000", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NODES_SIMULATION", + "task": "WBV2-P1101-001", + "owner": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ASSET_IO", + "task": "WBV2-P1101-002", + "owner": "ASSET", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCULPT_PAINT", + "task": "WBV2-P1101-003", + "owner": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR", + "task": "WBV2-P1102-000", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "INVENTORY_GATE", + "task": "WBV2-P1102-001", + "owner": "RELEASE", + "sourceBacked": true, + "capabilities": [], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "OBJECT_OPERATIONS", + "task": "WBV2-P1103-000", + "owner": "OBJECT", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_SEQUENCER", + "task": "WBV2-P1104-000", + "owner": "MEDIA", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUDIO_PARTICLE", + "task": "WBV2-P1105-000", + "owner": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "RIG_ANIMATION", + "task": "WBV2-P1106-000", + "owner": "RIG", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORE_SCENE_GRAPH_SETTINGS", + "task": "WBV2-P1129-001", + "owner": "CORE_SCENE", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR_VIEW2D_STATE", + "task": "WBV2-P1130-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "CURVE_TOPOLOGY_EDITOR", + "task": "WBV2-P1131-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/M9-05/manifest.json", + "report": "tests/golden/M9-05/curve-toggle-cyclic.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_HANDLE_GIZMO", + "task": "WBV2-P1132-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_SPLINES_TRANSACTION", + "task": "WBV2-P1133-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SURFACE_TOPOLOGY_TRANSACTION", + "task": "WBV2-P1134-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_BODY_TRANSACTION", + "task": "WBV2-P1135-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_PROPERTIES_TRANSACTION", + "task": "WBV2-P1136-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "METABALL_ELEMENTS_TRANSACTION", + "task": "WBV2-P1137-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXT_SOURCE_TRANSACTION", + "task": "WBV2-P1138-001", + "owner": "SCRIPTING", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXTURE_PROPERTIES_TRANSACTION", + "task": "WBV2-P1139-001", + "owner": "TEXTURE", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_GROUP_READER", + "task": "WBV2-P1140-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_POSE_MARKERS_READER", + "task": "WBV2-P1141-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_SAMPLE_READER", + "task": "WBV2-P1142-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_READER", + "task": "WBV2-P1143-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "DRIVER_READER", + "task": "WBV2-P1144-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORRECTIVE_SMOOTH_READER", + "task": "WBV2-P1145-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH", + "task": "WBV2-P1146-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_TWO", + "task": "WBV2-P1147-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_THREE", + "task": "WBV2-P1148-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FOUR", + "task": "WBV2-P1149-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FIVE", + "task": "WBV2-P1150-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "task": "WBV2-P1151-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_SIX", + "task": "WBV2-P1152-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "task": "WBV2-P1153-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE", + "task": "WBV2-P1154-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_RNA_READER_BATCH", + "task": "WBV2-P1155-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_VOLUME_DISPLACE_BATCH", + "task": "WBV2-P1156-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SHAPE_KEY_POINT_READER_BATCH", + "task": "WBV2-P1157-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_READER_BATCH", + "task": "WBV2-P1158-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_COLLECTION_READER_BATCH", + "task": "WBV2-P1159-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_SUBTYPE_READER_BATCH", + "task": "WBV2-P1160-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "task": "WBV2-P1161-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SHAPEKEY_READER_BATCH", + "task": "WBV2-P1162-001", + "owner": "MODIFIER", + "sourceBacked": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NODE_READER_BATCH", + "task": "WBV2-P1163-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NATIVE_NODE_BATCH", + "task": "WBV2-P1164-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + } + ], + "tasks": [ + { + "id": "WBV2-P1096-000", + "phase": "1096", + "title": "supersede_generic_continuation_queue", + "kind": "bridge", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1095-003" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "bridge", + "gate": "QUEUE", + "card": "docs/tasks/WBV2-P1096-000.md", + "behavior": "Replace the generic continuation queue with a finite module execution plan without claiming capability parity.", + "outputs": [ + "bridge manifest", + "status" + ], + "acceptance": [ + "no parity claim", + "inventory preserved", + "module plan hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-000", + "phase": "1100", + "title": "reorganize_module_execution_plan", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1096-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-000.md", + "behavior": "Reuse completed source-backed work and activate finite module-level implementation and verification.", + "outputs": [ + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "completed receipts reused", + "generic continuation excluded", + "one module active", + "inventory preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-001", + "phase": "1100", + "title": "verify_render_light_camera_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1100-000" + ], + "parityId": "RENDER_LIGHT_CAMERA", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-render_light_camera", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-001.md", + "behavior": "Complete the RENDER_LIGHT_CAMERA module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_LIGHT_CAMERA", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "positive": [ + "setLightProperties", + "setWorldProperties", + "setCameraProperties", + "camera panorama", + "world environment", + "light shadow/cascade" + ], + "negative": [ + "invalid enum", + "invalid numeric bounds", + "near/far conflict", + "unknown target", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:lighting-field-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-lighting-fields-production.spec.ts tests/e2e/lighting-field-roundtrip.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-002", + "phase": "1100", + "title": "verify_scene_object_mesh_module", + "kind": "module", + "owner": "SCENE_MESH", + "dependsOn": [ + "WBV2-P1100-001" + ], + "parityId": "SCENE_OBJECT_MESH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-scene_object_mesh", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-002.md", + "behavior": "Complete the SCENE_OBJECT_MESH module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCENE_OBJECT_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "positive": [ + "mesh topology", + "visibility", + "transform", + "collection membership" + ], + "negative": [ + "invalid selection", + "stale revision", + "linked data" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts tests/e2e/wbv2-scene-object-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-003", + "phase": "1100", + "title": "verify_material_animation_module", + "kind": "module", + "owner": "MATERIAL_ANIMATION", + "dependsOn": [ + "WBV2-P1100-002" + ], + "parityId": "MATERIAL_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-material_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-003.md", + "behavior": "Complete the MATERIAL_ANIMATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "positive": [ + "principled material", + "image node", + "keyframe", + "FCurve" + ], + "negative": [ + "unsupported graph", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-000", + "phase": "1101", + "title": "verify_nonmesh_geometry_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1100-003" + ], + "parityId": "NONMESH_GEOMETRY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nonmesh_geometry", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-000.md", + "behavior": "Complete the NONMESH_GEOMETRY module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NONMESH_GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "curve", + "surface", + "font", + "volume", + "metaball", + "grease pencil" + ], + "negative": [ + "unsupported data", + "resource missing", + "malformed geometry" + ], + "recovery": [ + "save/reopen", + "resource disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-001", + "phase": "1101", + "title": "verify_nodes_simulation_module", + "kind": "module", + "owner": "NODES_SIMULATION", + "dependsOn": [ + "WBV2-P1101-000" + ], + "parityId": "NODES_SIMULATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_simulation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-001.md", + "behavior": "Complete the NODES_SIMULATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted node graph", + "physics manifest", + "stable hash" + ], + "negative": [ + "unsupported node", + "budget exceeded", + "stale revision" + ], + "recovery": [ + "save/reopen", + "cache disposal" + ], + "commands": [ + "npm --prefix web run test:geometry-node-main-reader", + "npm --prefix web run test:physics-main-reader" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-002", + "phase": "1101", + "title": "verify_asset_io_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1101-001" + ], + "parityId": "ASSET_IO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-asset_io", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-002.md", + "behavior": "Complete the ASSET_IO module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ASSET_IO", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "positive": [ + "append", + "link", + "override", + "reload", + "asset catalog v2" + ], + "negative": [ + "missing source", + "ownership violation", + "hash drift", + "collision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "IndexedDB restart" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-v2", + "npm --prefix web run test:asset-catalog-migration", + "npm --prefix web run test:asset-catalog-negatives", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-link-override-production.spec.ts tests/e2e/wbv2-asset-catalog-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-003", + "phase": "1101", + "title": "verify_sculpt_paint_module", + "kind": "module", + "owner": "SCULPT_PAINT", + "dependsOn": [ + "WBV2-P1101-002" + ], + "parityId": "SCULPT_PAINT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-sculpt_paint", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-003.md", + "behavior": "Complete the SCULPT_PAINT module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "positive": [ + "vertex colors", + "vertex weights", + "bounded sculpt stroke" + ], + "negative": [ + "mirror unverified", + "invalid patch", + "unsupported brush" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:paint-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-paint-attributes-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-000", + "phase": "1102", + "title": "implement_ui_editor_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1101-003" + ], + "parityId": "UI_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-000.md", + "behavior": "Complete the UI_EDITOR module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "sourcePaths": [ + "web/protocol/editor-workflow.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "editor context", + "workspace", + "area/region" + ], + "negative": [ + "unsupported editor", + "invalid context" + ], + "recovery": [ + "worker restart", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:editor-main-reader", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-workflow-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-001", + "phase": "1102", + "title": "close_module_execution_gate", + "kind": "module", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P1102-000" + ], + "parityId": "INVENTORY_GATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-inventory_gate", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-001.md", + "behavior": "Complete the INVENTORY_GATE module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "INVENTORY_GATE", + "sourceBacked": true, + "capabilities": [], + "sourcePaths": [ + "tests/golden/WBV2-P0-002/parity-map.json", + "tests/golden/WBV2-P1100-000/module-execution-plan.json" + ], + "reuseReceipts": [], + "positive": [ + "aggregate module receipts", + "catalog hash" + ], + "negative": [ + "missing receipt", + "hash drift", + "false completion" + ], + "recovery": [ + "re-run affected module only" + ], + "commands": [ + "node tools/web/check-wbv2-module-execution.mjs", + "npm --prefix web run build" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1103-000", + "phase": "1103", + "title": "aggregate_object_operations_module", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1102-001" + ], + "parityId": "OBJECT_OPERATIONS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_operations", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1103-000.md", + "behavior": "Aggregate the existing source-backed Object Main operations into one module and revalidate the Chromium operator matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "OBJECT_OPERATIONS", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "positive": [ + "duplicate", + "create", + "parent", + "collection", + "rename", + "delete", + "transform apply" + ], + "negative": [ + "unknown object", + "invalid parent cycle", + "malformed transform" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts tests/e2e/wbv2-object-create-production.spec.ts tests/e2e/wbv2-object-parent-production.spec.ts tests/e2e/wbv2-collection-create-production.spec.ts tests/e2e/wbv2-object-rename-production.spec.ts tests/e2e/wbv2-object-delete-production.spec.ts tests/e2e/wbv2-object-transform-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1104-000", + "phase": "1104", + "title": "verify_compositor_sequencer_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1103-000" + ], + "parityId": "COMPOSITOR_SEQUENCER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_sequencer", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1104-000.md", + "behavior": "Verify the source-backed compositor and sequencer module through golden, unsupported-gate and media recovery cases.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main or compositor mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "COMPOSITOR_SEQUENCER", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/compositor.ts", + "web/protocol/sequencer.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "compositor node graph", + "sequencer still-image timeline", + "media cache contract" + ], + "negative": [ + "unsupported compositor node", + "invalid sequencer strip", + "stale media revision" + ], + "recovery": [ + "worker restart", + "save/reopen", + "media cache replay", + "movie codec blocked without READY receipt" + ], + "commands": [ + "npm --prefix web run test:compositor-node-golden", + "npm --prefix web run test:compositor-unsupported-gate", + "npm --prefix web run test:sequencer-main-reader", + "node --test web/tests/unit/sequencer-media-cache.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-021 sequencer|real Blender 5.2 sequencer\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1105-000", + "phase": "1105", + "title": "verify_audio_particle_module", + "kind": "module", + "owner": "AUDIO_PARTICLE", + "dependsOn": [ + "WBV2-P1104-000" + ], + "parityId": "AUDIO_PARTICLE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-audio_particle", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1105-000.md", + "behavior": "Verify Sound, Speaker and ParticleSettings mutations against authoritative Blender Main with explicit build capability gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven or a typed build capability blocker is recorded", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/protocol/io-media-commands.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "positive": [ + "Sound properties", + "Speaker properties", + "ParticleSettings properties" + ], + "negative": [ + "missing Main datablock", + "unsupported build feature", + "out-of-range property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker restart" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-audio-particle-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1106-000", + "phase": "1106", + "title": "verify_rig_animation_module", + "kind": "module", + "owner": "RIG", + "dependsOn": [ + "WBV2-P1105-000" + ], + "parityId": "RIG_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-rig_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1106-000.md", + "behavior": "Verify armature pose, constraints and NLA animation through the existing Blender Main primitives.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RIG_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "armature pose", + "constraint edit", + "NLA stack" + ], + "negative": [ + "missing bone", + "invalid constraint influence", + "stale NLA revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-rig-pose-production.spec.ts", + "npm --prefix web run test:nla-operator", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1107-000", + "phase": "1107", + "title": "verify_modifier_system_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1106-000" + ], + "parityId": "MODIFIER_SYSTEM", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_system", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1107-000.md", + "behavior": "Verify modifier stack visibility and bounded parameter mutation through authoritative Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SYSTEM", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER-STATE-MUTATION", + "CAP-MODIFIER-PARAMETER-EDIT", + "CAP-MODIFIER-STACK-READER" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/modifier-graph.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "report": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json" + } + ], + "positive": [ + "modifier visibility toggle", + "bounded DECIMATE parameter mutation", + "modifier stack evaluation reader" + ], + "negative": [ + "unknown modifier UUID", + "stale mesh revision", + "out-of-range parameter" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "npm --prefix web run test:modifier-goldens", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1108-000", + "phase": "1108", + "title": "verify_nodes_graph_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1107-000" + ], + "parityId": "NODES_GRAPH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_graph", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1108-000.md", + "behavior": "Verify Geometry Nodes graph identity, allowlisted evaluation, field budgets and unsupported graph retention.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive graph reader/evaluation evidence is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_GRAPH", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-GRAPH", + "CAP-GEOMETRY-NODES-ALLOWLIST", + "CAP-GEOMETRY-NODES-FIELD-BUDGET" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted graph identity", + "Blender depsgraph geometry evaluation", + "field materialization with exact domain cardinality" + ], + "negative": [ + "unsupported node graph", + "field budget overflow", + "stale or invalid graph command" + ], + "recovery": [ + "save/reopen", + "worker restart", + "graph retention after rejected command", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:geometry-node-evaluator-golden", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1109-000", + "phase": "1109", + "title": "verify_io_format_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1108-000" + ], + "parityId": "IO_FORMAT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-io_format", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1109-000.md", + "behavior": "Verify format capability routing, runtime receipts, recovery and fail-closed file UI gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive format routing/readiness evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "IO_FORMAT", + "sourceBacked": true, + "capabilities": [ + "CAP-IO-FORMAT-CAPABILITY-MATRIX", + "CAP-IO-FORMAT-RUNTIME-RECEIPTS", + "CAP-IO-FORMAT-RECOVERY", + "CAP-IO-FORMAT-UI-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/asset-library-io.ts", + "web/protocol/io-format-capability-matrix.ts", + "web/protocol/io-format-receipt-binding.ts", + "web/protocol/io-format-runtime-receipt.ts", + "web/protocol/io-format-recovery.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "GLB export readiness", + "format runtime receipt inventory", + "declared .blend import route" + ], + "negative": [ + "unverified format route", + "cancelled or OOM operation", + "unsupported file extension" + ], + "recovery": [ + "worker restart", + "small operation recovery", + "deterministic receipt replay", + "fail-closed UI route" + ], + "commands": [ + "node tools/web/check-io-format-receipt-bindings.mjs", + "node tools/web/check-io-format-runtime-receipts.mjs", + "node tools/web/check-io-format-recovery.mjs", + "node tools/web/check-io-format-ui-gate.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/io-format-recovery.spec.ts tests/e2e/io-format-ui-gate.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1110-000", + "phase": "1110", + "title": "verify_render_pipeline_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1109-000" + ], + "parityId": "RENDER_PIPELINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-render_pipeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1110-000.md", + "behavior": "Verify render backend routing, explicit resource budgets and Blender reference comparison in Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive render/reference evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic render receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_PIPELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-BACKEND-ROUTING", + "CAP-RENDER-RESOURCE-BUDGET", + "CAP-RENDER-REFERENCE-COMPARISON" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/render-routing.ts", + "web/protocol/render-budget.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/render-image-comparison.ts", + "web/protocol/server-render-job.ts", + "web/app/src/three-adapter/render-routing.ts", + "web/app/src/three-adapter/render-image-comparison.ts", + "web/app/src/workers/viewport-render.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "bounded local backend routing", + "reference render metrics", + "resource budget acceptance" + ], + "negative": [ + "unknown or unavailable backend", + "aggregate texture/light budget overflow", + "wrong composition reference" + ], + "recovery": [ + "retain previous texture set", + "offscreen renderer parity", + "worker restart", + "deterministic second render" + ], + "commands": [ + "npm --prefix web run test:render-resource-budget", + "npm --prefix web run test:render-routing", + "npm --prefix web run test:render-reference", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1111-000", + "phase": "1111", + "title": "verify_scripting_security_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1110-000" + ], + "parityId": "SCRIPTING_SECURITY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-scripting_security", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1111-000.md", + "behavior": "Verify script source Main reader, deny-by-default permission policy and sandbox isolation/recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader and policy evidence is proven", + "negative and recovery cases are proven", + "Chromium sandbox receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCRIPTING_SECURITY", + "sourceBacked": true, + "capabilities": [ + "CAP-SCRIPT-MAIN-READER", + "CAP-SCRIPT-PERMISSION-POLICY", + "CAP-SCRIPT-SANDBOX-ISOLATION", + "CAP-SCRIPT-SANDBOX-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/scripting-platform.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/script-permission-policy-test.worker.ts", + "web/app/src/workers/script-sandbox-isolation-test.worker.ts", + "web/app/src/workers/script-sandbox-recovery-test.worker.ts", + "web/app/src/testing/script-sandbox-recovery.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "script source inventory reader", + "explicit READ_MAIN permission", + "new-generation recovery audit" + ], + "negative": [ + "autorun denied by default", + "undeclared permission", + "sandbox crash/timeout/late result" + ], + "recovery": [ + "worker restart", + "sandbox generation rollover", + "continuous audit chain", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:script-main-reader", + "npm --prefix web run test:scripting-isolation", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/script-permission-policy.spec.ts tests/e2e/script-sandbox-isolation.spec.ts tests/e2e/script-sandbox-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1112-000", + "phase": "1112", + "title": "verify_animation_timeline_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1111-000" + ], + "parityId": "ANIMATION_TIMELINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_timeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1112-000.md", + "behavior": "Verify frame evaluation and NLA time mapping through the production Worker and Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive frame/NLA evaluation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic evaluation receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ANIMATION_TIMELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-FRAME-EVALUATION", + "CAP-NLA-TIME-MAPPING", + "CAP-ANIMATION-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/protocol/depsgraph.ts", + "web/protocol/scene-ir.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "frame 1/5/10 evaluation", + "NLA track and strip mapping", + "Blender depsgraph animation result" + ], + "negative": [ + "stale NLA revision", + "invalid strip topology", + "unsupported animation domain" + ], + "recovery": [ + "save/reopen", + "worker restart", + "deterministic repeated evaluation", + "preserve rejected stack" + ], + "commands": [ + "npm --prefix web run test:frame-evaluation", + "node tools/web/check-nla-evaluation-golden.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/nla-evaluation-golden.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1113-000", + "phase": "1113", + "title": "verify_shader_material_module", + "kind": "module", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P1112-000" + ], + "parityId": "SHADER_MATERIAL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shader_material", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1113-000.md", + "behavior": "Verify bounded Shader graph compilation, stable compile keys and fail-closed pipeline recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Shader Main compilation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic compile receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHADER_MATERIAL", + "sourceBacked": true, + "capabilities": [ + "CAP-SHADER-GRAPH-COMPILER", + "CAP-SHADER-COMPILE-KEY", + "CAP-SHADER-FAIL-CLOSED-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/shader-graph.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-compiler.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "Principled/Image/Normal/Math graph compile", + "stable compile key", + "real Main shader material path" + ], + "negative": [ + "unknown shader node", + "graph cycle or duplicate link", + "unsupported renderer backend" + ], + "recovery": [ + "retain previous material after compile failure", + "worker restart", + "deterministic repeated compile", + "save/reopen material graph" + ], + "commands": [ + "npm --prefix web run test:shader-compile", + "npm --prefix web run test:shader-pipeline", + "npm --prefix web run test:shader-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1114-000", + "phase": "1114", + "title": "verify_grease_pencil_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1113-000" + ], + "parityId": "GREASE_PENCIL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1114-000.md", + "behavior": "Verify Grease Pencil layer/frame Main mutations, stable identity validation and roundtrip recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Grease Pencil Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-LAYER-FRAME", + "CAP-GREASE-PENCIL-STROKE-READER", + "CAP-GREASE-PENCIL-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/grease-pencil-reorder.ts", + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "create and reorder layer", + "insert and move frame", + "stable Grease Pencil drawing reader" + ], + "negative": [ + "forged drawing identity", + "occupied frame target", + "stale layer/frame revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic layer/frame replay" + ], + "commands": [ + "npm --prefix web run test:grease-pencil-reorder", + "npm --prefix web run test:grease-pencil", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1115-000", + "phase": "1115", + "title": "verify_curve_surface_editing_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1114-000" + ], + "parityId": "CURVE_SURFACE_EDITING", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_surface_editing", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1115-000.md", + "behavior": "Verify Curve topology/handle edits, Surface topology and non-mesh/font roundtrip through Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive non-mesh Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SURFACE_EDITING", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-HANDLES", + "CAP-SURFACE-TOPOLOGY", + "CAP-NONMESH-FONT-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/curve-topology-editor.ts", + "web/protocol/non-mesh.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + } + ], + "positive": [ + "Curve control point and handle edit", + "Curve cyclic/topology operator", + "Surface and Font property mutation" + ], + "negative": [ + "invalid curve selection/domain", + "occupied or stale frame/topology target", + "malformed non-mesh property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic multispline replay" + ], + "commands": [ + "npm --prefix web run test:curve-topology-operator", + "npm --prefix web run test:nonmesh-roundtrip", + "npm --prefix web run test:nonmesh-desktop-golden", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1116-000", + "phase": "1116", + "title": "verify_storage_recovery_module", + "kind": "module", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1115-000" + ], + "parityId": "STORAGE_RECOVERY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-storage_recovery", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1116-000.md", + "behavior": "Verify IndexedDB catalog migration/restart and OPFS asset preview deduplication, quarantine and reference GC.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive storage commit/recovery evidence is proven", + "negative and quarantine cases are proven", + "Chromium restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "STORAGE_RECOVERY", + "sourceBacked": true, + "capabilities": [ + "CAP-INDEXEDDB-CATALOG-MIGRATION", + "CAP-OPFS-PREVIEW-COMMIT", + "CAP-OPFS-QUARANTINE-GC" + ], + "sourcePaths": [ + "web/protocol/storage.ts", + "web/protocol/storage-budget.ts", + "web/protocol/save-transaction.ts", + "web/protocol/recent-projects.ts", + "web/protocol/asset-preview.ts", + "web/protocol/asset-preview-decode.ts", + "web/app/src/storage/asset-catalog-indexeddb.ts", + "web/app/src/storage/asset-preview-opfs-commit.ts", + "web/app/src/storage/asset-preview-quarantine.ts", + "web/app/src/storage/asset-preview-reference-gc.ts", + "web/app/src/storage/opfs-files.ts", + "web/app/src/storage/migrations.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "v1 to v2 catalog migration", + "page/Worker restart identity", + "content-addressed preview deduplication" + ], + "negative": [ + "partial catalog migration", + "corrupt preview quarantine", + "cross-project or non-final reference GC" + ], + "recovery": [ + "IndexedDB restart", + "OPFS commit replay", + "quarantine cleanup", + "deterministic reference reclamation" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-restart", + "npm --prefix web run test:asset-preview-dedup", + "npm --prefix web run test:asset-preview-quarantine", + "npm --prefix web run test:asset-preview-reference-gc", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1117-000", + "phase": "1117", + "title": "verify_simulation_cache_module", + "kind": "module", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1116-000" + ], + "parityId": "SIMULATION_CACHE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-simulation_cache", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1117-000.md", + "behavior": "Verify simulation cache identity, physics-family payload integrity, lifecycle recovery and deterministic LRU pruning.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive cache identity/lifecycle evidence is proven", + "negative integrity and budget cases are proven", + "Chromium restart and quarantine receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SIMULATION_CACHE", + "sourceBacked": true, + "capabilities": [ + "CAP-SIMULATION-CACHE-IDENTITY", + "CAP-PHYSICS-CACHE-INTEGRITY", + "CAP-SIMULATION-CACHE-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/simulation-cache.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/physics-cache-playback.ts", + "web/protocol/storage.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "graph/source/revision cache identity", + "all physics-family frame hashes", + "verified playback lifecycle" + ], + "negative": [ + "source or payload hash drift", + "revision/range mismatch", + "cache byte/frame budget overflow" + ], + "recovery": [ + "cancel and cleanup", + "LRU prune with protected playback", + "corruption quarantine", + "worker restart" + ], + "commands": [ + "npm --prefix web run test:simulation-cache-identity", + "npm --prefix web run test:simulation-cache-lifecycle", + "npm --prefix web run test:physics-cache-family", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1118-000", + "phase": "1118", + "title": "verify_ui_input_interaction_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1117-000" + ], + "parityId": "UI_INPUT_INTERACTION", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-ui_input_interaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1118-000.md", + "behavior": "Verify keyboard-only user actions, input mutex, IME/pointer state and responsive editor interaction under deployment CSP.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive keyboard Main mutation and save are proven", + "negative mutex/input cases are proven", + "Chromium accessibility and responsive receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_INPUT_INTERACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-KEYBOARD-USER-ACTIONS", + "CAP-INPUT-MODAL-STATE", + "CAP-IME-SHORTCUT-GUARD", + "CAP-RESPONSIVE-CSP-UI" + ], + "sourcePaths": [ + "web/app/index.html", + "web/app/src/app/App.tsx", + "web/app/src/app/app-shell.css", + "web/app/src/workers/web-engine.worker.ts", + "web/protocol/user-action-state.ts", + "web/protocol/project-action-mutex.ts", + "web/protocol/ime-composition.ts", + "web/protocol/input-modal.ts", + "web/protocol/pointer-contract.ts", + "web/protocol/worker-fault.ts", + "web/tests/unit/user-action-state.test.mjs", + "web/tests/unit/project-action-mutex.test.mjs", + "web/tests/unit/ime-composition.test.mjs", + "web/tests/unit/input-modal.test.mjs", + "web/tests/unit/pointer-contract.test.mjs" + ], + "reuseReceipts": [], + "positive": [ + "keyboard-only Add Cube Main mutation", + "keyboard save/reopen and GLB export", + "responsive controls at desktop/mobile viewports" + ], + "negative": [ + "concurrent project action mutex", + "IME shortcut suppression", + "pointer cancel/touch modal cleanup" + ], + "recovery": [ + "worker restart", + "save interruption recovery", + "responsive layout preservation", + "deterministic repeated keyboard loop" + ], + "commands": [ + "node --test web/tests/unit/user-action-state.test.mjs web/tests/unit/project-action-mutex.test.mjs web/tests/unit/ime-composition.test.mjs web/tests/unit/input-modal.test.mjs web/tests/unit/pointer-contract.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/keyboard-accessibility.spec.ts tests/e2e/responsive-layout.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1119-000", + "phase": "1119", + "title": "verify_library_workflow_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1118-000" + ], + "parityId": "LIBRARY_WORKFLOW", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-library_workflow", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1119-000.md", + "behavior": "Verify append, link, override and reload library flows through authoritative Main with path and dependency safety gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive library Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LIBRARY_WORKFLOW", + "sourceBacked": true, + "capabilities": [ + "CAP-LIBRARY-APPEND", + "CAP-LIBRARY-LINK", + "CAP-LIBRARY-OVERRIDE", + "CAP-LIBRARY-RELOAD-SAFETY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/library-main-append.ts", + "web/protocol/library-linked-mutation.ts", + "web/protocol/library-linked-reload.ts", + "web/protocol/library-linked-missing.ts", + "web/protocol/library-override-writer.ts", + "web/protocol/library-override-freshness.ts", + "web/protocol/library-negative-cases.ts", + "web/protocol/library-operation-identity.ts", + "web/protocol/library-source-origin.ts", + "web/protocol/asset-path.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" + } + ], + "positive": [ + "append object into Main", + "linked read-only object", + "local override and reload identity" + ], + "negative": [ + "missing library source", + "dependency/cross-library cycle", + "unsafe path or ownership mutation" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic library replay" + ], + "commands": [ + "npm --prefix web run test:library-main-append", + "npm --prefix web run test:library-link-chromium", + "npm --prefix web run test:library-override-chromium", + "npm --prefix web run test:library-negative-cases", + "npm --prefix web run test:library-path-security", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1120-000", + "phase": "1120", + "title": "verify_volume_nanovdb_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1119-000" + ], + "parityId": "VOLUME_NANOVDB", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-volume_nanovdb", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1120-000.md", + "behavior": "Verify NanoVDB manifest, paged feedback, OPFS commit/restart and production viewport volume roundtrip.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive volume resource and viewport evidence is proven", + "negative and recovery cases are proven", + "Chromium OPFS/restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "VOLUME_NANOVDB", + "sourceBacked": true, + "capabilities": [ + "CAP-NANOVDB-MANIFEST", + "CAP-NANOVDB-PAGED-FEEDBACK", + "CAP-NANOVDB-OPFS-RESTART", + "CAP-NANOVDB-VIEWPORT-ROUNDTRIP" + ], + "sourcePaths": [ + "web/protocol/volume-vdb.ts", + "web/protocol/nanovdb-page-feedback.ts", + "web/protocol/nanovdb-device-recovery.ts", + "web/protocol/storage.ts", + "web/app/src/volume/nanovdb-opfs.ts", + "web/app/src/volume/nanovdb-stream.ts", + "web/app/src/volume/nanovdb-viewport.ts", + "web/app/src/volume/nanovdb-float32.ts", + "web/app/src/render/nanovdb-volume-renderer.ts", + "web/app/src/workers/vdb-opfs-test.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "validated NanoVDB bundle manifest", + "content-addressed OPFS commit", + "main/offscreen production viewport volume" + ], + "negative": [ + "manifest/chunk hash mismatch", + "stale source binding", + "WebGPU/resource availability block" + ], + "recovery": [ + "OPFS Worker restart", + "paged feedback resume", + "quota/device loss cleanup", + "deterministic volume save/reopen" + ], + "commands": [ + "npm --prefix web run test:vdb-availability", + "npm --prefix web run test:vdb-native", + "npm --prefix web run test:nanovdb-page-feedback", + "npm --prefix web run test:nanovdb-opfs-restart", + "npm --prefix web run test:nanovdb-volume-roundtrip", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1121-000", + "phase": "1121", + "title": "verify_paint_stroke_module", + "kind": "module", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P1120-000" + ], + "parityId": "PAINT_STROKE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-paint_stroke", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1121-000.md", + "behavior": "Verify paint pointer sessions, depth visibility and PBVH capability gates through the production Worker.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive paint Main transaction is proven", + "negative and recovery cases are proven", + "Chromium pointer/GPU receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "PAINT_STROKE", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-POINTER-SESSION", + "CAP-PAINT-DEPTH-VISIBILITY", + "CAP-PAINT-PBVH-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/sculpt.ts", + "web/protocol/paint.ts", + "web/protocol/paint-stroke-session.ts", + "web/protocol/paint-depth-visibility.ts", + "web/protocol/paint-pbvh-capability.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/three-adapter/paint-depth-visibility.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "ordered paint pointer chunks", + "main/offscreen depth visibility", + "PBVH inventory capability query" + ], + "negative": [ + "stale/discontinuous pointer chunks", + "forged or over-budget depth samples", + "missing PBVH WASM entrypoint" + ], + "recovery": [ + "pointer cancel without Main mutation", + "undo step after paint commit", + "worker restart", + "deterministic capability replay" + ], + "commands": [ + "npm --prefix web run test:paint-stroke-session", + "npm --prefix web run test:paint-depth-visibility", + "npm --prefix web run test:paint-pbvh-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1122-000", + "phase": "1122", + "title": "verify_engine_runtime_module", + "kind": "module", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1121-000" + ], + "parityId": "ENGINE_RUNTIME", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-engine_runtime", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1122-000.md", + "behavior": "Verify WebEngine variant manifest/selection, compiled WASM Main ABI and Worker crash recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive compiled WASM Main lifecycle is proven", + "negative variant/hash cases are proven", + "Chromium Worker restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ENGINE_RUNTIME", + "sourceBacked": true, + "capabilities": [ + "CAP-ENGINE-VARIANT-MANIFEST", + "CAP-ENGINE-WASM-MAIN-ABI", + "CAP-WORKER-CRASH-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.h", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/protocol/engine-variant.ts", + "web/protocol/worker-fault.ts", + "web/protocol/save-transaction.ts", + "web/app/src/engine-client/engine-variant-bootstrap.ts", + "web/app/src/engine-client/browser-engine-variant-session.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "single/pthread manifest binding", + "compiled WASM Main open/save lifecycle", + "engine and storage Worker recovery" + ], + "negative": [ + "malformed variant/resource declaration", + "mixed-version/hash mismatch", + "pthread unavailable fallback" + ], + "recovery": [ + "single-thread fallback", + "Worker crash restart", + "operation-log restore", + "deterministic repeated startup" + ], + "commands": [ + "npm --prefix web run test:engine-manifest-v2", + "npm --prefix web run test:engine-variant-selection", + "npm --prefix web run test:engine-variant-fallback", + "npm --prefix web run test:engine-variant-install", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-native-engine-production.spec.ts tests/e2e/worker-crash-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1123-000", + "phase": "1123", + "title": "repair_glb_roundtrip_dependency_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1122-000" + ], + "parityId": "GLB_ROUNDTRIP_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-glb_roundtrip_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1123-000.md", + "behavior": "Repair the standalone GLB checker dependency chain and verify mesh/non-mesh Blender roundtrip plus Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive GLB and non-mesh roundtrip are proven", + "negative and recovery cases are proven", + "Chromium save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GLB_ROUNDTRIP_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GLB-MESH-ROUNDTRIP", + "CAP-GLB-NONMESH-ROUNDTRIP", + "CAP-GLB-CHROMIUM-RECOVERY" + ], + "sourcePaths": [ + "tools/web/check-glb-blender-roundtrip.mjs", + "tools/web/check-nonmesh-glb-blender-roundtrip.mjs", + "tools/web/blender-check-glb-roundtrip.py", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/protocol/nonmesh-binary.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "mesh/material/skin/animation GLB roundtrip", + "Curve/Surface/Font/Metaball non-mesh mapping", + "desktop GLB Main persistence in Chromium" + ], + "negative": [ + "sparse or oversized GLB", + "external URI/extension rejection", + "non-mesh export loss gate" + ], + "recovery": [ + "cancel without publishing output", + "Worker restart", + "OPFS quota retains old asset", + "deterministic Blender roundtrip" + ], + "commands": [ + "npm --prefix web run test:glb-blender-roundtrip", + "npm --prefix web run test:nonmesh-glb-blender-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/glb-negative-cases.spec.ts tests/e2e/glb-recovery.spec.ts tests/e2e/glb-main-persistence.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1124-000", + "phase": "1124", + "title": "record_historical_hash_drift_module", + "kind": "module", + "owner": "PROVENANCE", + "dependsOn": [ + "WBV2-P1123-000" + ], + "parityId": "HISTORICAL_HASH_DRIFT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-historical_hash_drift", + "gate": "EVIDENCE", + "card": "docs/tasks/WBV2-P1124-000.md", + "behavior": "Record legacy M12 artifact hash drift without re-signing historical manifests or changing the immutable inventory.", + "outputs": [ + "drift report", + "module receipt", + "manifest", + "status" + ], + "acceptance": [ + "original and observed hashes are recorded", + "provenance remains BLOCKED_SOURCE_LOST where bytes cannot be restored", + "historical manifests and inventory remain unchanged", + "deterministic drift evidence is reproducible", + "no full-family parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "HISTORICAL_HASH_DRIFT", + "sourceBacked": true, + "capabilities": [ + "CAP-HISTORICAL-HASH-AUDIT", + "CAP-PROVENANCE-SOURCE-LOST-GATE" + ], + "sourcePaths": [ + "tools/web/check-m12-manifest-drift.mjs", + "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "reuseReceipts": [], + "positive": [ + "84 drift entries captured", + "43 affected artifact paths indexed", + "immutable inventory binding preserved" + ], + "negative": [ + "missing original bytes", + "attempted historical re-signing", + "inventory mutation" + ], + "recovery": [ + "deterministic report rerun", + "source cache can restore original bytes later", + "new capability manifests reference drift evidence only" + ], + "commands": [ + "node tools/web/check-m12-manifest-drift.mjs --write", + "node tools/web/check-m12-manifest-drift.mjs", + "node tools/web/check-wbv2-module-execution.mjs" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1125-000", + "phase": "1125", + "title": "repair_geometry_nodes_allowlist_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1124-000" + ], + "parityId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-geometry_nodes_allowlist_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1125-000.md", + "behavior": "Persist Geometry Nodes graph overrides in Web-safe Main storage and align allowlist assertions with real materialization behavior.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "supported graph Main materialization is proven", + "unsupported graph remains rejected without mutation", + "save/reopen graph retention is exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-MAIN-PERSISTENCE", + "CAP-GEOMETRY-NODES-ALLOWLIST-CONSISTENCY", + "CAP-GEOMETRY-NODES-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/web-engine.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/geometry-node-allowlist.spec.ts", + "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "allowlisted graph materializes into Main", + "Scene IDProperty graph override persists", + "save/reopen retains graph identity/hash" + ], + "negative": [ + "unsupported simulation node", + "invalid graph schema", + "missing node/link endpoint" + ], + "recovery": [ + "rejected graph leaves baseline unchanged", + "undo/redo graph override", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:geometry-node-allowlist", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1126-000", + "phase": "1126", + "title": "verify_grease_pencil_viewport_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1125-000" + ], + "parityId": "GREASE_PENCIL_VIEWPORT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-grease_pencil_viewport", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1126-000.md", + "behavior": "Verify Grease Pencil 2D/3D selection and marquee integration on both viewport backends using an isolated Chromium port.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "2D and 3D selection revisions converge", + "main-thread and Offscreen marquee are exact", + "stale/foreign selection cases remain fail-closed", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_VIEWPORT", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-SELECTION-REVISION", + "CAP-GREASE-PENCIL-MARQUEE-MAIN", + "CAP-GREASE-PENCIL-MARQUEE-OFFSCREEN" + ], + "sourcePaths": [ + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/workers/viewport-render.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "2D canvas selection revision", + "main-thread 3D marquee selection", + "OffscreenCanvas 3D marquee selection" + ], + "negative": [ + "stale selection revision", + "foreign drawing identity", + "duplicate or forged point candidate" + ], + "recovery": [ + "selection convergence across backends", + "worker viewport restart", + "deterministic repeated marquee", + "preserve Main revision" + ], + "commands": [ + "WEB_TEST_PORT=5331 npm --prefix web run test:e2e -- --workers=1 tests/e2e/grease-pencil-selection.spec.ts tests/e2e/grease-pencil-marquee.spec.ts", + "node --test web/tests/unit/grease-pencil-selection.test.mjs web/tests/unit/grease-pencil-marquee.test.mjs", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1127-000", + "phase": "1127", + "title": "verify_tracking_mask_module", + "kind": "module", + "owner": "TRACKING", + "dependsOn": [ + "WBV2-P1126-000" + ], + "parityId": "TRACKING_MASK", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-tracking_mask", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1127-000.md", + "behavior": "Verify Mask reader, editable point raycast/marquee and tracking capability gates through Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Mask reader and interaction evidence is proven", + "negative solve/resource cases are proven", + "Chromium stable IDs and recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TRACKING_MASK", + "sourceBacked": true, + "capabilities": [ + "CAP-MASK-MAIN-READER", + "CAP-MASK-POINT-RAYCAST", + "CAP-TRACKING-SOLVE-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/tracking-mask.ts", + "web/protocol/scene-ir.ts", + "web/app/src/tracking/MaskSelection.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/smoke.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Mask layers and splines reader", + "editable Mask point raycast", + "N-022 tracking marker/mask gate" + ], + "negative": [ + "foreign mask point identity", + "missing resource binding", + "camera solve unavailable" + ], + "recovery": [ + "main/offscreen marquee parity", + "worker restart", + "deterministic stable IDs", + "preserve source Main on blocked solve" + ], + "commands": [ + "npm --prefix web run test:mask-main-reader", + "WEB_TEST_PORT=5340 npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-022 tracking|real Blender 5.2 Mask\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1128-000", + "phase": "1128", + "title": "verify_ffmpeg_movie_codec_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1127-000" + ], + "parityId": "SEQUENCER_MOVIE_CODEC", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-sequencer_movie_codec", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1128-000.md", + "behavior": "Use a local ffmpeg.wasm Worker fallback for movie probing and proxy-frame extraction when Chromium HTML media decoding is unavailable.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and core-resource hashes are bound", + "positive MP4 probe and RGBA frame are proven", + "corrupt and source-identity cases are rejected", + "AbortSignal cancellation leaves no live Worker", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SEQUENCER_MOVIE_CODEC", + "sourceBacked": true, + "capabilities": [ + "CAP-FFMPEG-WASM-MOVIE-PROBE", + "CAP-FFMPEG-WASM-PROXY-FRAME", + "CAP-MOVIE-CODEC-RECOVERY" + ], + "sourcePaths": [ + "web/package.json", + "web/package-lock.json", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerCodecProbe.ts", + "web/app/src/sequencer/FFmpegMovieProbe.ts", + "web/app/src/sequencer/ffmpeg-movie-probe.worker.ts", + "web/app/src/sequencer/SequencerMediaProxyCache.ts", + "web/app/src/vendor/ffmpeg/ffmpeg-core.js", + "web/app/src/vendor/ffmpeg/ffmpeg-core.wasm", + "web/app/public/vendor/ffmpeg/ffmpeg-core.js", + "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm", + "third_party/ffmpeg.wasm/package.json", + "third_party/ffmpeg.wasm/README.md", + "web/tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "browser decode fallback to ffmpeg.wasm", + "16x16 MP4 metadata probe", + "8x8 RGBA proxy frame extraction" + ], + "negative": [ + "corrupt movie payload", + "source SHA mismatch", + "ffmpeg runtime unavailable" + ], + "recovery": [ + "AbortSignal cancellation", + "Worker termination after response", + "cache manifest identity binding", + "deterministic repeated probe" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5342 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1129-000", + "phase": "1129", + "title": "authorize_scene_settings_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1128-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1129", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-000.md", + "behavior": "Authorize one source-backed Core Scene Graph settings module after the terminal P1128 module epoch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1128 evidence remains hash-bound", + "existing receipts are reused", + "inventory remains immutable", + "one source-backed module is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ] + }, + { + "id": "WBV2-P1129-001", + "phase": "1129", + "title": "verify_scene_settings_module", + "kind": "module", + "owner": "CORE_SCENE", + "dependsOn": [ + "WBV2-P1129-000" + ], + "parityId": "CORE_SCENE_GRAPH_SETTINGS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-core_scene_graph_settings", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-001.md", + "behavior": "Verify the existing Blender Main scene compositor, performance and sampling setting transactions as one aggregate module.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutations are proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORE_SCENE_GRAPH_SETTINGS", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "positive": [ + "compositor device/precision mutation", + "performance thread/persistence mutation", + "sampling filter/dither mutation" + ], + "negative": [ + "invalid sampling range", + "unknown scene target", + "malformed property set" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic scene settings snapshot" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5344 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1130-000", + "phase": "1130", + "title": "authorize_editor_view2d_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1129-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1130", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-000.md", + "behavior": "Authorize one source-backed UI editor View2D reader/protocol module after the P1129 scene settings module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1129 evidence remains hash-bound", + "P1102 editor workflow source remains unchanged", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1130-001", + "phase": "1130", + "title": "verify_editor_view2d_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1130-000" + ], + "parityId": "UI_EDITOR_VIEW2D_STATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor_view2d_state", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-001.md", + "behavior": "Preserve Blender Graph/Dope Sheet View2D cur and mask state through the Web editor protocol without changing the existing editor workflow parser.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader state is proven", + "negative no-publish and recovery are proven", + "Chromium and save/reopen compatibility are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR_VIEW2D_STATE", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/editor-view2d.ts", + "web/app/src/workers/editor-view2d-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Graph main-region View2D cur retention", + "Graph main-region pixel mask retention", + "reader/protocol exact state" + ], + "negative": [ + "inverted View2D bounds", + "malformed mask range", + "missing View2D payload" + ], + "recovery": [ + "immutable base editor workflow", + "worker termination", + "deterministic repeated parse", + "save/reopen reader compatibility" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5346 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1131-000", + "phase": "1131", + "title": "authorize_curve_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1130-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1131", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-000.md", + "behavior": "Authorize one source-backed Curve topology editor module after the P1130 View2D module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1130 evidence remains hash-bound", + "Curve topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1131-001", + "phase": "1131", + "title": "verify_curve_topology_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1131-000" + ], + "parityId": "CURVE_TOPOLOGY_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_topology_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-001.md", + "behavior": "Verify the Blender Curve TOGGLE_CYCLIC topology transaction through the existing Main, protocol, Worker and frontend path.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_TOPOLOGY_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/curve-topology-editor.ts", + "web/app/src/workers/curve-topology-contract-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/curve-topology-contract.spec.ts", + "web/tests/e2e/curve-topology-operator.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "TOGGLE_CYCLIC Main mutation", + "operator gate exposes only verified capability", + "save/reopen preserves cyclic spline state" + ], + "negative": [ + "unknown curve operator", + "stale revision claim", + "selection and payload budget overflow" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic contract parse" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5347 npm --prefix web run test:e2e -- --workers=1 tests/e2e/curve-topology-contract.spec.ts tests/e2e/curve-topology-operator.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1132-000", + "phase": "1132", + "title": "authorize_curve_handle_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1131-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1132", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-000.md", + "behavior": "Authorize one source-backed Curve handle gizmo module after the P1131 topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1131 evidence remains hash-bound", + "Curve handle source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1132-001", + "phase": "1132", + "title": "verify_curve_handle_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1132-000" + ], + "parityId": "CURVE_HANDLE_GIZMO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_handle_gizmo", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-001.md", + "behavior": "Verify Curve handle position edits through Blender Main, protocol, Worker, renderer preview and frontend gizmo.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_HANDLE_GIZMO", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/nonmesh-interaction.ts", + "web/app/src/workers/nonmesh-interaction-test.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/nonmesh.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Curve handle position Main mutation", + "local handle gizmo preview", + "save/reopen preserves handle state" + ], + "negative": [ + "invalid handle identity", + "stale base revision", + "malformed handle position" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic preview" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5348 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1133-000", + "phase": "1133", + "title": "authorize_curve_splines_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1132-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1133", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-000.md", + "behavior": "Authorize one source-backed Curve spline transaction module after the P1132 handle module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1132 evidence remains hash-bound", + "Curve spline source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1133-001", + "phase": "1133", + "title": "verify_curve_splines_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1133-000" + ], + "parityId": "CURVE_SPLINES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_splines_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-001.md", + "behavior": "Verify complete Curve spline replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SPLINES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "complete Curve spline Main transaction", + "POLY/BEZIER descriptor retention", + "save/reopen preserves spline state" + ], + "negative": [ + "invalid spline offsets", + "stale base revision", + "mismatched handle payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic binary-geometry transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1134-000", + "phase": "1134", + "title": "authorize_surface_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1133-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1134", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-000.md", + "behavior": "Authorize one source-backed Surface topology transaction module after the P1133 Curve spline module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1133 evidence remains hash-bound", + "Surface topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1134-001", + "phase": "1134", + "title": "verify_surface_topology_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1134-000" + ], + "parityId": "SURFACE_TOPOLOGY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-surface_topology_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-001.md", + "behavior": "Verify Surface NURBS topology replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SURFACE_TOPOLOGY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Surface topology Main transaction", + "NURBS dimensions and weights retention", + "save/reopen preserves surface state" + ], + "negative": [ + "invalid surface dimensions", + "stale base revision", + "control grid budget mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic surface transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5350 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1135-000", + "phase": "1135", + "title": "authorize_font_body_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1134-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1135", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-000.md", + "behavior": "Authorize one source-backed Font body transaction module after the P1134 Surface topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1134 evidence remains hash-bound", + "Font body source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1135-001", + "phase": "1135", + "title": "verify_font_body_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1135-000" + ], + "parityId": "FONT_BODY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_body_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-001.md", + "behavior": "Verify Font body replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_BODY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-body-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font body Main mutation", + "UTF-8 text retention", + "save/reopen preserves text" + ], + "negative": [ + "unknown Font data ID", + "body byte budget overflow", + "malformed body payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic text state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5351 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-body-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1136-000", + "phase": "1136", + "title": "authorize_font_properties_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1135-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1136", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-000.md", + "behavior": "Authorize one source-backed Font properties transaction module after the P1135 Font body module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1135 evidence remains hash-bound", + "Font property source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1136-001", + "phase": "1136", + "title": "verify_font_properties_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1136-000" + ], + "parityId": "FONT_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-001.md", + "behavior": "Verify Font property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font property Main mutation", + "bounded alignment/extrude fields", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Font data ID", + "invalid alignment enum", + "out-of-range numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5352 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1137-000", + "phase": "1137", + "title": "authorize_metaball_elements_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1136-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1137", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-000.md", + "behavior": "Authorize one source-backed Metaball element transaction module after the P1136 Font properties module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1136 evidence remains hash-bound", + "Metaball element source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1137-001", + "phase": "1137", + "title": "verify_metaball_elements_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1137-000" + ], + "parityId": "METABALL_ELEMENTS_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-metaball_elements_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-001.md", + "behavior": "Verify Metaball element replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "METABALL_ELEMENTS_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Metaball element Main mutation", + "bounded position/radius/scale retention", + "save/reopen preserves elements" + ], + "negative": [ + "unknown Metaball data ID", + "invalid radius", + "element count topology mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic element state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1138-000", + "phase": "1138", + "title": "authorize_text_source_module", + "kind": "enabling", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1137-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1138", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-000.md", + "behavior": "Authorize a source-backed Text datablock mutation after the P1137 Metaball module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1137 evidence remains hash-bound", + "ID_TXT is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1138-001", + "phase": "1138", + "title": "verify_text_source_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1138-000" + ], + "parityId": "TEXT_SOURCE_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-text_source_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-001.md", + "behavior": "Verify Text source replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXT_SOURCE_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-text-source-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "positive": [ + "Text source Main mutation", + "ID_TXT registration in WITH_WEB", + "save/reopen preserves source" + ], + "negative": [ + "unknown Text data ID", + "source over 1 MiB", + "linked/read-only Text" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic source state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-text-source-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1139-000", + "phase": "1139", + "title": "authorize_texture_properties_module", + "kind": "enabling", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1138-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1139", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-000.md", + "behavior": "Authorize a source-backed Texture property mutation module after P1138 Text.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1138 evidence remains hash-bound", + "ID_TE is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1139-001", + "phase": "1139", + "title": "verify_texture_properties_module", + "kind": "module", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1139-000" + ], + "parityId": "TEXTURE_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-texture_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-001.md", + "behavior": "Verify Texture property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXTURE_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-texture-properties-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "positive": [ + "Texture property Main mutation", + "ID_TE registration in WITH_WEB", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Texture data ID", + "noise depth outside Blender bounds", + "non-finite numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-texture-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1140-000", + "phase": "1140", + "title": "authorize_action_group_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1139-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1140", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-000.md", + "behavior": "Authorize a source-backed ActionGroup reader and recovery module after P1139 Texture.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1139 evidence remains hash-bound", + "ActionGroup has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1140-001", + "phase": "1140", + "title": "verify_action_group_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-000" + ], + "parityId": "ACTION_GROUP_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_group_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-001.md", + "behavior": "Verify ActionGroup metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_GROUP_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-group-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "positive": [ + "ActionGroup Main reader exposes group and expanded metadata", + "three grouped location F-Curves remain grouped", + "save/reopen preserves group metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "unsupported group payload is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic group state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5356 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-group-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1141-000", + "phase": "1141", + "title": "authorize_action_pose_markers_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1141", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-000.md", + "behavior": "Authorize a source-backed ActionPoseMarkers reader and recovery module after P1140.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1140 evidence remains hash-bound", + "ActionPoseMarkers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1141-001", + "phase": "1141", + "title": "verify_action_pose_markers_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-000" + ], + "parityId": "ACTION_POSE_MARKERS_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_pose_markers_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-001.md", + "behavior": "Verify ActionPoseMarkers metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_POSE_MARKERS_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-pose-markers-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "positive": [ + "ActionPoseMarkers Main reader exposes marker names and frames", + "three Blender pose markers remain ordered", + "save/reopen preserves marker metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "non-finite marker frame is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic marker state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5359 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-pose-markers-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1142-000", + "phase": "1142", + "title": "authorize_fcurve_sample_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1142", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-000.md", + "behavior": "Authorize a source-backed FCurveSample reader and recovery module after P1141.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1141 evidence remains hash-bound", + "FCurveSample has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1142-001", + "phase": "1142", + "title": "verify_fcurve_sample_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-000" + ], + "parityId": "FCURVE_SAMPLE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_sample_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-001.md", + "behavior": "Verify FCurveSample data through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_SAMPLE_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "positive": [ + "FCurveSample Main reader exposes sampled source and values", + "four native FPoint samples remain ordered", + "save/reopen preserves sampled data" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing sampled payload is fail-closed", + "non-finite sampled value is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic sampled state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5365 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1143-000", + "phase": "1143", + "title": "authorize_fcurve_modifier_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1143", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-000.md", + "behavior": "Authorize a source-backed FCurve modifier reader and recovery module after P1142.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1142 evidence remains hash-bound", + "FCurveModifiers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1143-001", + "phase": "1143", + "title": "verify_fcurve_modifier_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-000" + ], + "parityId": "FCURVE_MODIFIER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-001.md", + "behavior": "Verify FCurve modifier metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "positive": [ + "FCurveModifiers Main reader exposes native modifier stack", + "FModifierCycles preserves type/name/flags/influence", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing modifier payload is fail-closed", + "unsupported modifier type is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic modifier state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5368 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1144-000", + "phase": "1144", + "title": "authorize_driver_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1144", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-000.md", + "behavior": "Authorize a source-backed Driver reader and recovery module after P1143.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1143 evidence remains hash-bound", + "Driver has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1144-001", + "phase": "1144", + "title": "verify_driver_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1144-000" + ], + "parityId": "DRIVER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-driver_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-001.md", + "behavior": "Verify Driver metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "DRIVER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-driver-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "positive": [ + "AnimData driver list is read from Blender Main", + "Driver preserves scripted expression and variables", + "save/reopen preserves driver metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing driver target is fail-closed", + "non-finite driver influence is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic driver state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-driver-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1145-000", + "phase": "1145", + "title": "authorize_corrective_smooth_reader_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1144-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1145", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-000.md", + "behavior": "Authorize a source-backed Corrective Smooth reader/recovery module after the Driver reader.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "Corrective Smooth has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1145-001", + "phase": "1145", + "title": "verify_corrective_smooth_reader_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1145-000" + ], + "parityId": "CORRECTIVE_SMOOTH_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-corrective_smooth_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-001.md", + "behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORRECTIVE_SMOOTH_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "Corrective Smooth type is read from Blender Main", + "RNA metadata is preserved", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported modifier data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1146-000", + "phase": "1146", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1145-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1146", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1146-001", + "phase": "1146", + "title": "verify modifier reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1146-000" + ], + "parityId": "MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_datatransfer type is read from Blender Main", + "MOD_dynamicpaint type is read from Blender Main", + "MOD_explode type is read from Blender Main", + "MOD_fluid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_datatransfer", + "modifier-source:MOD_dynamicpaint", + "modifier-source:MOD_explode", + "modifier-source:MOD_fluid", + "rna-struct:DataTransferModifier", + "rna-struct:DynamicPaintModifier", + "rna-struct:ExplodeModifier", + "rna-struct:FluidModifier", + "rna-struct:FluidDomainSettings" + ] + } + }, + { + "id": "WBV2-P1147-000", + "phase": "1147", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1146-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1147", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1147-001", + "phase": "1147", + "title": "verify modifier reader batch two", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1147-000" + ], + "parityId": "MODIFIER_READER_BATCH_TWO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_two", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_TWO batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_TWO", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_laplaciandeform type is read from Blender Main", + "MOD_laplaciansmooth type is read from Blender Main", + "MOD_mask type is read from Blender Main", + "MOD_mesh_to_volume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_laplaciandeform", + "modifier-source:MOD_laplaciansmooth", + "modifier-source:MOD_mask", + "modifier-source:MOD_shrinkwrap", + "rna-struct:LaplacianDeformModifier", + "rna-struct:LaplacianSmoothModifier", + "rna-struct:MaskModifier", + "rna-struct:ShrinkwrapModifier" + ] + } + }, + { + "id": "WBV2-P1148-000", + "phase": "1148", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1147-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1148", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1148-001", + "phase": "1148", + "title": "verify modifier reader batch three", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1148-000" + ], + "parityId": "MODIFIER_READER_BATCH_THREE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_three", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_THREE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_THREE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_remesh type is read from Blender Main", + "MOD_skin type is read from Blender Main", + "MOD_weighted_normal type is read from Blender Main", + "MOD_warp type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_remesh", + "modifier-source:MOD_skin", + "modifier-source:MOD_weighted_normal", + "modifier-source:MOD_warp", + "rna-struct:RemeshModifier", + "rna-struct:SkinModifier", + "rna-struct:WeightedNormalModifier", + "rna-struct:WarpModifier" + ] + } + }, + { + "id": "WBV2-P1149-000", + "phase": "1149", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1148-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1149", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1149-001", + "phase": "1149", + "title": "verify modifier reader batch four", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1149-000" + ], + "parityId": "MODIFIER_READER_BATCH_FOUR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_four", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FOUR batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FOUR", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_uvproject type is read from Blender Main", + "MOD_uvwarp type is read from Blender Main", + "MOD_volume_displace type is read from Blender Main", + "MOD_volume_to_mesh type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1149-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_four_scene.blend WBV2_BATCH_TYPES='[\"UV_PROJECT\",\"UV_WARP\",\"NORMAL_EDIT\",\"VOLUME_TO_MESH\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_uvproject\",\"modifier-source:MOD_uvwarp\",\"modifier-source:MOD_normal_edit\",\"modifier-source:MOD_volume_to_mesh\",\"rna-struct:UVProjectModifier\",\"rna-struct:UVWarpModifier\",\"rna-struct:NormalEditModifier\",\"rna-struct:VolumeToMeshModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1149-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_uvproject", + "modifier-source:MOD_uvwarp", + "modifier-source:MOD_normal_edit", + "modifier-source:MOD_volume_to_mesh", + "rna-struct:UVProjectModifier", + "rna-struct:UVWarpModifier", + "rna-struct:NormalEditModifier", + "rna-struct:VolumeToMeshModifier" + ] + } + }, + { + "id": "WBV2-P1150-000", + "phase": "1150", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1149-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1150", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1150-001", + "phase": "1150", + "title": "verify modifier reader batch five", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1150-000" + ], + "parityId": "MODIFIER_READER_BATCH_FIVE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_five", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FIVE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FIVE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_meshcache type is read from Blender Main", + "MOD_meshsequencecache type is read from Blender Main", + "MOD_multires type is read from Blender Main", + "MOD_ocean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1150-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_five_scene.blend WBV2_BATCH_TYPES='[\"MESH_CACHE\",\"MESH_SEQUENCE_CACHE\",\"MULTIRES\",\"OCEAN\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_meshcache\",\"modifier-source:MOD_meshsequencecache\",\"modifier-source:MOD_multires\",\"modifier-source:MOD_ocean\",\"rna-struct:MeshCacheModifier\",\"rna-struct:MeshSequenceCacheModifier\",\"rna-struct:MultiresModifier\",\"rna-struct:OceanModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_meshcache", + "modifier-source:MOD_meshsequencecache", + "modifier-source:MOD_multires", + "modifier-source:MOD_ocean", + "rna-struct:MeshCacheModifier", + "rna-struct:MeshSequenceCacheModifier", + "rna-struct:MultiresModifier", + "rna-struct:OceanModifier" + ] + } + }, + { + "id": "WBV2-P1151-000", + "phase": "1151", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1150-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1151", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1151-001", + "phase": "1151", + "title": "verify Grease Pencil modifier reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1151-000" + ], + "parityId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil_modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-001.md", + "behavior": "Verify the GREASE_PENCIL_MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_grease_pencil_armature type is read from Blender Main", + "MOD_grease_pencil_array type is read from Blender Main", + "MOD_grease_pencil_build type is read from Blender Main", + "MOD_grease_pencil_color type is read from Blender Main", + "MOD_grease_pencil_dash type is read from Blender Main", + "MOD_grease_pencil_envelope type is read from Blender Main", + "MOD_grease_pencil_hook type is read from Blender Main", + "MOD_grease_pencil_lattice type is read from Blender Main", + "MOD_grease_pencil_length type is read from Blender Main", + "MOD_grease_pencil_mirror type is read from Blender Main", + "MOD_grease_pencil_multiply type is read from Blender Main", + "MOD_grease_pencil_noise type is read from Blender Main", + "MOD_grease_pencil_offset type is read from Blender Main", + "MOD_grease_pencil_opacity type is read from Blender Main", + "MOD_grease_pencil_outline type is read from Blender Main", + "MOD_grease_pencil_shrinkwrap type is read from Blender Main", + "MOD_grease_pencil_simplify type is read from Blender Main", + "MOD_grease_pencil_smooth type is read from Blender Main", + "MOD_grease_pencil_subdiv type is read from Blender Main", + "MOD_grease_pencil_texture type is read from Blender Main", + "MOD_grease_pencil_thickness type is read from Blender Main", + "MOD_grease_pencil_time type is read from Blender Main", + "MOD_grease_pencil_tint type is read from Blender Main", + "MOD_grease_pencil_weight_angle type is read from Blender Main", + "MOD_grease_pencil_weight_proximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1151-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_grease_pencil_scene.blend WBV2_BATCH_TYPES='[\"GREASE_PENCIL_ARMATURE\",\"GREASE_PENCIL_ARRAY\",\"GREASE_PENCIL_BUILD\",\"GREASE_PENCIL_COLOR\",\"GREASE_PENCIL_DASH\",\"GREASE_PENCIL_ENVELOPE\",\"GREASE_PENCIL_HOOK\",\"GREASE_PENCIL_LATTICE\",\"GREASE_PENCIL_LENGTH\",\"GREASE_PENCIL_MIRROR\",\"GREASE_PENCIL_MULTIPLY\",\"GREASE_PENCIL_NOISE\",\"GREASE_PENCIL_OFFSET\",\"GREASE_PENCIL_OPACITY\",\"GREASE_PENCIL_OUTLINE\",\"GREASE_PENCIL_SHRINKWRAP\",\"GREASE_PENCIL_SIMPLIFY\",\"GREASE_PENCIL_SMOOTH\",\"GREASE_PENCIL_SUBDIV\",\"GREASE_PENCIL_TEXTURE\",\"GREASE_PENCIL_THICKNESS\",\"GREASE_PENCIL_TIME\",\"GREASE_PENCIL_TINT\",\"GREASE_PENCIL_VERTEX_WEIGHT_ANGLE\",\"GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_grease_pencil_armature\",\"modifier-source:MOD_grease_pencil_array\",\"modifier-source:MOD_grease_pencil_build\",\"modifier-source:MOD_grease_pencil_color\",\"modifier-source:MOD_grease_pencil_dash\",\"modifier-source:MOD_grease_pencil_envelope\",\"modifier-source:MOD_grease_pencil_hook\",\"modifier-source:MOD_grease_pencil_lattice\",\"modifier-source:MOD_grease_pencil_length\",\"modifier-source:MOD_grease_pencil_mirror\",\"modifier-source:MOD_grease_pencil_multiply\",\"modifier-source:MOD_grease_pencil_noise\",\"modifier-source:MOD_grease_pencil_offset\",\"modifier-source:MOD_grease_pencil_opacity\",\"modifier-source:MOD_grease_pencil_outline\",\"modifier-source:MOD_grease_pencil_shrinkwrap\",\"modifier-source:MOD_grease_pencil_simplify\",\"modifier-source:MOD_grease_pencil_smooth\",\"modifier-source:MOD_grease_pencil_subdiv\",\"modifier-source:MOD_grease_pencil_texture\",\"modifier-source:MOD_grease_pencil_thickness\",\"modifier-source:MOD_grease_pencil_time\",\"modifier-source:MOD_grease_pencil_tint\",\"modifier-source:MOD_grease_pencil_weight_angle\",\"modifier-source:MOD_grease_pencil_weight_proximity\",\"rna-struct:GreasePencilArmatureModifier\",\"rna-struct:GreasePencilArrayModifier\",\"rna-struct:GreasePencilBuildModifier\",\"rna-struct:GreasePencilColorModifier\",\"rna-struct:GreasePencilEnvelopeModifier\",\"rna-struct:GreasePencilHookModifier\",\"rna-struct:GreasePencilLatticeModifier\",\"rna-struct:GreasePencilLengthModifier\",\"rna-struct:GreasePencilMirrorModifier\",\"rna-struct:GreasePencilMultiplyModifier\",\"rna-struct:GreasePencilNoiseModifier\",\"rna-struct:GreasePencilOffsetModifier\",\"rna-struct:GreasePencilOpacityModifier\",\"rna-struct:GreasePencilOutlineModifier\",\"rna-struct:GreasePencilShrinkwrapModifier\",\"rna-struct:GreasePencilSimplifyModifier\",\"rna-struct:GreasePencilSmoothModifier\",\"rna-struct:GreasePencilSubdivModifier\",\"rna-struct:GreasePencilTextureModifier\",\"rna-struct:GreasePencilTimeModifier\",\"rna-struct:GreasePencilTintModifier\",\"rna-struct:GreasePencilWeightAngleModifier\",\"rna-struct:GreasePencilWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_armature", + "modifier-source:MOD_grease_pencil_array", + "modifier-source:MOD_grease_pencil_build", + "modifier-source:MOD_grease_pencil_color", + "modifier-source:MOD_grease_pencil_dash", + "modifier-source:MOD_grease_pencil_envelope", + "modifier-source:MOD_grease_pencil_hook", + "modifier-source:MOD_grease_pencil_lattice", + "modifier-source:MOD_grease_pencil_length", + "modifier-source:MOD_grease_pencil_mirror", + "modifier-source:MOD_grease_pencil_multiply", + "modifier-source:MOD_grease_pencil_noise", + "modifier-source:MOD_grease_pencil_offset", + "modifier-source:MOD_grease_pencil_opacity", + "modifier-source:MOD_grease_pencil_outline", + "modifier-source:MOD_grease_pencil_shrinkwrap", + "modifier-source:MOD_grease_pencil_simplify", + "modifier-source:MOD_grease_pencil_smooth", + "modifier-source:MOD_grease_pencil_subdiv", + "modifier-source:MOD_grease_pencil_texture", + "modifier-source:MOD_grease_pencil_thickness", + "modifier-source:MOD_grease_pencil_time", + "modifier-source:MOD_grease_pencil_tint", + "modifier-source:MOD_grease_pencil_weight_angle", + "modifier-source:MOD_grease_pencil_weight_proximity", + "rna-struct:GreasePencilArmatureModifier", + "rna-struct:GreasePencilArrayModifier", + "rna-struct:GreasePencilBuildModifier", + "rna-struct:GreasePencilColorModifier", + "rna-struct:GreasePencilEnvelopeModifier", + "rna-struct:GreasePencilHookModifier", + "rna-struct:GreasePencilLatticeModifier", + "rna-struct:GreasePencilLengthModifier", + "rna-struct:GreasePencilMirrorModifier", + "rna-struct:GreasePencilMultiplyModifier", + "rna-struct:GreasePencilNoiseModifier", + "rna-struct:GreasePencilOffsetModifier", + "rna-struct:GreasePencilOpacityModifier", + "rna-struct:GreasePencilOutlineModifier", + "rna-struct:GreasePencilShrinkwrapModifier", + "rna-struct:GreasePencilSimplifyModifier", + "rna-struct:GreasePencilSmoothModifier", + "rna-struct:GreasePencilSubdivModifier", + "rna-struct:GreasePencilTextureModifier", + "rna-struct:GreasePencilTimeModifier", + "rna-struct:GreasePencilTintModifier", + "rna-struct:GreasePencilWeightAngleModifier", + "rna-struct:GreasePencilWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1152-000", + "phase": "1152", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1151-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1152", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1152-001", + "phase": "1152", + "title": "verify modifier reader batch six", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1152-000" + ], + "parityId": "MODIFIER_READER_BATCH_SIX", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_six", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_SIX batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_SIX", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_mesh_to_volume type is read from Blender Main", + "MOD_particleinstance type is read from Blender Main", + "MOD_surface type is read from Blender Main", + "MOD_weightvgedit type is read from Blender Main", + "MOD_weightvgmix type is read from Blender Main", + "MOD_weightvgproximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1152-001 WBV2_BATCH_FIXTURES='[\"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend\",\"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend\",\"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend\",\"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend\",\"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend\",\"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend\"]' WBV2_BATCH_TYPES='[\"MESH_TO_VOLUME\",\"PARTICLE_INSTANCE\",\"SURFACE\",\"VERTEX_WEIGHT_EDIT\",\"VERTEX_WEIGHT_MIX\",\"VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_mesh_to_volume\",\"modifier-source:MOD_particleinstance\",\"modifier-source:MOD_surface\",\"modifier-source:MOD_weightvgedit\",\"modifier-source:MOD_weightvgmix\",\"modifier-source:MOD_weightvgproximity\",\"rna-struct:MeshToVolumeModifier\",\"rna-struct:ParticleInstanceModifier\",\"rna-struct:SurfaceModifier\",\"rna-struct:VertexWeightEditModifier\",\"rna-struct:VertexWeightMixModifier\",\"rna-struct:VertexWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_mesh_to_volume", + "modifier-source:MOD_particleinstance", + "modifier-source:MOD_surface", + "modifier-source:MOD_weightvgedit", + "modifier-source:MOD_weightvgmix", + "modifier-source:MOD_weightvgproximity", + "rna-struct:MeshToVolumeModifier", + "rna-struct:ParticleInstanceModifier", + "rna-struct:SurfaceModifier", + "rna-struct:VertexWeightEditModifier", + "rna-struct:VertexWeightMixModifier", + "rna-struct:VertexWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1153-000", + "phase": "1153", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1152-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1153", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1153-001", + "phase": "1153", + "title": "reuse verified modifier receipts for shared source utilities", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1153-000" + ], + "parityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_source_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-001.md", + "behavior": "Verify the MODIFIER_SOURCE_DEPENDENCY_REUSE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "dependencyReuse": [ + { + "unitId": "modifier-source:MOD_grease_pencil_util", + "representativeUnitId": "modifier-source:MOD_grease_pencil_array", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "marker": "MOD_grease_pencil_util.hh", + "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_mdd", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_mdd_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_pc2", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_pc2_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_util", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_util.hh", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_weightvg_util", + "representativeUnitId": "modifier-source:MOD_weightvgedit", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "marker": "MOD_weightvg_util.hh", + "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + } + ], + "positive": [ + "MOD_grease_pencil_util type is read from Blender Main", + "MOD_meshcache_mdd type is read from Blender Main", + "MOD_meshcache_pc2 type is read from Blender Main", + "MOD_meshcache_util type is read from Blender Main", + "MOD_weightvg_util type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_util", + "modifier-source:MOD_meshcache_mdd", + "modifier-source:MOD_meshcache_pc2", + "modifier-source:MOD_meshcache_util", + "modifier-source:MOD_weightvg_util" + ] + } + }, + { + "id": "WBV2-P1154-000", + "phase": "1154", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1153-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1154", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1154-001", + "phase": "1154", + "title": "verify solidify split helper sources", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1154-000" + ], + "parityId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_solidify_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-001.md", + "behavior": "Verify the MODIFIER_SOLIDIFY_HELPER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-READER", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_generate_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "positive": [ + "MOD_solidify_extrude type is read from Blender Main", + "MOD_solidify_nonmanifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1154-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/modifier_generate_scene.blend WBV2_BATCH_TYPES='[\"SOLIDIFY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_solidify_extrude\",\"modifier-source:MOD_solidify_nonmanifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_solidify_extrude", + "modifier-source:MOD_solidify_nonmanifold" + ] + } + }, + { + "id": "WBV2-P1155-000", + "phase": "1155", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1154-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1155", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1155-001", + "phase": "1155", + "title": "verify modifier RNA reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1155-000" + ], + "parityId": "MODIFIER_RNA_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_rna_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-001.md", + "behavior": "Verify the MODIFIER_RNA_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_RNA_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_lineart type is read from Blender Main", + "MOD_particlesystem type is read from Blender Main", + "MOD_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1155-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURES='[\"tests/files/web/modifier_grease_pencil_scene.blend\",\"tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend\",\"tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend\"]' WBV2_BATCH_TYPES='[\"LINEART\",\"PARTICLE_SYSTEM\",\"DECIMATE\"]' WBV2_BATCH_UNITS='[\"rna-struct:GreasePencilLineartModifier\",\"rna-struct:ParticleSystemModifier\",\"rna-struct:DecimateModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "rna-struct:GreasePencilLineartModifier", + "rna-struct:ParticleSystemModifier", + "rna-struct:DecimateModifier" + ] + } + }, + { + "id": "WBV2-P1156-000", + "phase": "1156", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1155-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1156", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1156-001", + "phase": "1156", + "title": "verify volume displace modifier reader", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1156-000" + ], + "parityId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_volume_displace_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-001.md", + "behavior": "Verify the MODIFIER_VOLUME_DISPLACE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_volume_displace type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1156-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend WBV2_BATCH_TYPES='[\"VOLUME_DISPLACE\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_volume_displace\",\"rna-struct:VolumeDisplaceModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_volume_displace", + "rna-struct:VolumeDisplaceModifier" + ] + } + }, + { + "id": "WBV2-P1157-000", + "phase": "1157", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1156-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1157", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1157-001", + "phase": "1157", + "title": "verify shape key point reader", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1157-000" + ], + "parityId": "SHAPE_KEY_POINT_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shape_key_point_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-001.md", + "behavior": "Verify the SHAPE_KEY_POINT_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHAPE_KEY_POINT_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1157-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1157-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:ShapeKeyPoint\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1157-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:ShapeKeyPoint" + ] + } + }, + { + "id": "WBV2-P1158-000", + "phase": "1158", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1157-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1158", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1158-001", + "phase": "1158", + "title": "verify line style reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1158-000" + ], + "parityId": "LINE_STYLE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-001.md", + "behavior": "Verify the LINE_STYLE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1158-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1158-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FreestyleLineStyle\",\"rna-struct:LineStyleModifier\",\"rna-struct:LineStyleAlphaModifier\",\"rna-struct:LineStyleColorModifier\",\"rna-struct:LineStyleGeometryModifier\",\"rna-struct:LineStyleThicknessModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1158-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:FreestyleLineStyle", + "rna-struct:LineStyleModifier", + "rna-struct:LineStyleAlphaModifier", + "rna-struct:LineStyleColorModifier", + "rna-struct:LineStyleGeometryModifier", + "rna-struct:LineStyleThicknessModifier" + ] + } + }, + { + "id": "WBV2-P1159-000", + "phase": "1159", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1158-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1159", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1159-001", + "phase": "1159", + "title": "verify line style collection reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1159-000" + ], + "parityId": "LINE_STYLE_COLLECTION_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_collection_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-001.md", + "behavior": "Verify the LINE_STYLE_COLLECTION_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_COLLECTION_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1159-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1159-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_modifier_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:BlendDataLineStyles\",\"rna-struct:LineStyleColorModifiers\",\"rna-struct:LineStyleAlphaModifiers\",\"rna-struct:LineStyleThicknessModifiers\",\"rna-struct:LineStyleGeometryModifiers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1159-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:BlendDataLineStyles", + "rna-struct:LineStyleColorModifiers", + "rna-struct:LineStyleAlphaModifiers", + "rna-struct:LineStyleThicknessModifiers", + "rna-struct:LineStyleGeometryModifiers" + ] + } + }, + { + "id": "WBV2-P1160-000", + "phase": "1160", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1159-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1160", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1160-001", + "phase": "1160", + "title": "verify line style modifier subtype reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1160-000" + ], + "parityId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-001.md", + "behavior": "Verify the LINE_STYLE_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1160-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1160-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:LineStyleAlphaModifier_AlongStroke\",\"rna-struct:LineStyleAlphaModifier_CreaseAngle\",\"rna-struct:LineStyleAlphaModifier_Curvature_3D\",\"rna-struct:LineStyleAlphaModifier_DistanceFromCamera\",\"rna-struct:LineStyleAlphaModifier_DistanceFromObject\",\"rna-struct:LineStyleAlphaModifier_Material\",\"rna-struct:LineStyleAlphaModifier_Noise\",\"rna-struct:LineStyleAlphaModifier_Tangent\",\"rna-struct:LineStyleColorModifier_AlongStroke\",\"rna-struct:LineStyleColorModifier_CreaseAngle\",\"rna-struct:LineStyleColorModifier_Curvature_3D\",\"rna-struct:LineStyleColorModifier_DistanceFromCamera\",\"rna-struct:LineStyleColorModifier_DistanceFromObject\",\"rna-struct:LineStyleColorModifier_Material\",\"rna-struct:LineStyleColorModifier_Noise\",\"rna-struct:LineStyleColorModifier_Tangent\",\"rna-struct:LineStyleGeometryModifier_2DOffset\",\"rna-struct:LineStyleGeometryModifier_2DTransform\",\"rna-struct:LineStyleGeometryModifier_BackboneStretcher\",\"rna-struct:LineStyleGeometryModifier_BezierCurve\",\"rna-struct:LineStyleGeometryModifier_Blueprint\",\"rna-struct:LineStyleGeometryModifier_GuidingLines\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise1D\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise2D\",\"rna-struct:LineStyleGeometryModifier_Polygonalization\",\"rna-struct:LineStyleGeometryModifier_Sampling\",\"rna-struct:LineStyleGeometryModifier_Simplification\",\"rna-struct:LineStyleGeometryModifier_SinusDisplacement\",\"rna-struct:LineStyleGeometryModifier_SpatialNoise\",\"rna-struct:LineStyleGeometryModifier_TipRemover\",\"rna-struct:LineStyleThicknessModifier_AlongStroke\",\"rna-struct:LineStyleThicknessModifier_Calligraphy\",\"rna-struct:LineStyleThicknessModifier_CreaseAngle\",\"rna-struct:LineStyleThicknessModifier_Curvature_3D\",\"rna-struct:LineStyleThicknessModifier_DistanceFromCamera\",\"rna-struct:LineStyleThicknessModifier_DistanceFromObject\",\"rna-struct:LineStyleThicknessModifier_Material\",\"rna-struct:LineStyleThicknessModifier_Noise\",\"rna-struct:LineStyleThicknessModifier_Tangent\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1160-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:LineStyleAlphaModifier_AlongStroke", + "rna-struct:LineStyleAlphaModifier_CreaseAngle", + "rna-struct:LineStyleAlphaModifier_Curvature_3D", + "rna-struct:LineStyleAlphaModifier_DistanceFromCamera", + "rna-struct:LineStyleAlphaModifier_DistanceFromObject", + "rna-struct:LineStyleAlphaModifier_Material", + "rna-struct:LineStyleAlphaModifier_Noise", + "rna-struct:LineStyleAlphaModifier_Tangent", + "rna-struct:LineStyleColorModifier_AlongStroke", + "rna-struct:LineStyleColorModifier_CreaseAngle", + "rna-struct:LineStyleColorModifier_Curvature_3D", + "rna-struct:LineStyleColorModifier_DistanceFromCamera", + "rna-struct:LineStyleColorModifier_DistanceFromObject", + "rna-struct:LineStyleColorModifier_Material", + "rna-struct:LineStyleColorModifier_Noise", + "rna-struct:LineStyleColorModifier_Tangent", + "rna-struct:LineStyleGeometryModifier_2DOffset", + "rna-struct:LineStyleGeometryModifier_2DTransform", + "rna-struct:LineStyleGeometryModifier_BackboneStretcher", + "rna-struct:LineStyleGeometryModifier_BezierCurve", + "rna-struct:LineStyleGeometryModifier_Blueprint", + "rna-struct:LineStyleGeometryModifier_GuidingLines", + "rna-struct:LineStyleGeometryModifier_PerlinNoise1D", + "rna-struct:LineStyleGeometryModifier_PerlinNoise2D", + "rna-struct:LineStyleGeometryModifier_Polygonalization", + "rna-struct:LineStyleGeometryModifier_Sampling", + "rna-struct:LineStyleGeometryModifier_Simplification", + "rna-struct:LineStyleGeometryModifier_SinusDisplacement", + "rna-struct:LineStyleGeometryModifier_SpatialNoise", + "rna-struct:LineStyleGeometryModifier_TipRemover", + "rna-struct:LineStyleThicknessModifier_AlongStroke", + "rna-struct:LineStyleThicknessModifier_Calligraphy", + "rna-struct:LineStyleThicknessModifier_CreaseAngle", + "rna-struct:LineStyleThicknessModifier_Curvature_3D", + "rna-struct:LineStyleThicknessModifier_DistanceFromCamera", + "rna-struct:LineStyleThicknessModifier_DistanceFromObject", + "rna-struct:LineStyleThicknessModifier_Material", + "rna-struct:LineStyleThicknessModifier_Noise", + "rna-struct:LineStyleThicknessModifier_Tangent" + ] + } + }, + { + "id": "WBV2-P1161-000", + "phase": "1161", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1160-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1161", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1161-001", + "phase": "1161", + "title": "verify FCurve modifier subtype reader batch", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1161-000" + ], + "parityId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-001.md", + "behavior": "Verify the FCURVE_MODIFIER_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1161-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1161-001/fcurve-modifier-production.json WBV2_BATCH_FIXTURE=tests/files/web/fcurve_modifier_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FModifierEnvelope\",\"rna-struct:FModifierGenerator\",\"rna-struct:FModifierLimits\",\"rna-struct:FModifierNoise\",\"rna-struct:FModifierSmooth\",\"rna-struct:FModifierStepped\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1161-001/fcurve-modifier-production.json" + ], + "coverageBindings": [ + "rna-struct:FModifierEnvelope", + "rna-struct:FModifierGenerator", + "rna-struct:FModifierLimits", + "rna-struct:FModifierNoise", + "rna-struct:FModifierSmooth", + "rna-struct:FModifierStepped" + ] + } + }, + { + "id": "WBV2-P1162-000", + "phase": "1162", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1161-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1162", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1162-001", + "phase": "1162", + "title": "verify shape key modifier reader dependency", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1162-000" + ], + "parityId": "MODIFIER_SHAPEKEY_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_shapekey_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-001.md", + "behavior": "Verify the MODIFIER_SHAPEKEY_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "module": { + "moduleId": "MODIFIER_SHAPEKEY_READER_BATCH", + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_shapekey type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1162-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1162-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_shapekey\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1162-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_shapekey" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1163-000", + "phase": "1163", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1162-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1163", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1163-001", + "phase": "1163", + "title": "verify compositor node reader batch", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1163-000" + ], + "parityId": "COMPOSITOR_NODE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_node_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-001.md", + "behavior": "Verify the COMPOSITOR_NODE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "module": { + "moduleId": "COMPOSITOR_NODE_READER_BATCH", + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1163-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1163-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeGlare\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeGlare\",\"node:CompositorNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1163-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1164-000", + "phase": "1164", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1163-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1164", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1164-001", + "phase": "1164", + "title": "verify native compositor transform blur alpha reader", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1164-000" + ], + "parityId": "COMPOSITOR_NATIVE_NODE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_native_node_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-001.md", + "behavior": "Verify the COMPOSITOR_NATIVE_NODE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "module": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1164-001/compositor-main-reader-production.json b/tests/golden/WBV2-P1164-001/compositor-main-reader-production.json new file mode 100644 index 000000000..e55735889 --- /dev/null +++ b/tests/golden/WBV2-P1164-001/compositor-main-reader-production.json @@ -0,0 +1,132 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1164-001", + "operation": "COMPOSITOR_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/compositor_node_batch_scene.blend", + "sourceUnits": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "expectedTypes": [ + "CompositorNodeTransform", + "CompositorNodeBlur", + "CompositorNodeAlphaOver", + "VIEWER" + ], + "sourceRnaStructs": { + "rna-struct:CompositorNodeTree": "scene.compositorGraph", + "rna-struct:NodeTree": "scene.compositorGraph", + "rna-struct:NodeLinks": "scene.compositorGraph.links", + "rna-struct:NodeLink": "scene.compositorGraph.links[]" + }, + "fixtureSha256": "af7ab364d642fd6ac6f7f0b441e8bf82df6d1725a5fdbdd60f3400d40adeb647", + "graphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeAlphaOver", + "CompositorNodeBlur", + "CompositorNodeTransform", + "VIEWER" + ], + "links": [ + { + "fromNodeId": "compositor-node:1523343864", + "fromSocket": "Image", + "toNodeId": "compositor-node:1567428418", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:1567428418", + "fromSocket": "Image", + "toNodeId": "compositor-node:2012536477", + "toSocket": "Foreground" + }, + { + "fromNodeId": "compositor-node:2012536477", + "fromSocket": "Image", + "toNodeId": "compositor-node:309086207", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2012536477", + "fromSocket": "Image", + "toNodeId": "compositor-node:668657891", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2041292736", + "fromSocket": "Color", + "toNodeId": "compositor-node:1523343864", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2041292736", + "fromSocket": "Color", + "toNodeId": "compositor-node:2012536477", + "toSocket": "Fac" + } + ] + } + ], + "reopenedGraphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeAlphaOver", + "CompositorNodeBlur", + "CompositorNodeTransform", + "VIEWER" + ], + "links": [ + { + "fromNodeId": "compositor-node:1523343864", + "fromSocket": "Image", + "toNodeId": "compositor-node:1567428418", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:1567428418", + "fromSocket": "Image", + "toNodeId": "compositor-node:2012536477", + "toSocket": "Foreground" + }, + { + "fromNodeId": "compositor-node:2012536477", + "fromSocket": "Image", + "toNodeId": "compositor-node:309086207", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2012536477", + "fromSocket": "Image", + "toNodeId": "compositor-node:668657891", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2041292736", + "fromSocket": "Color", + "toNodeId": "compositor-node:1523343864", + "toSocket": "Image" + }, + { + "fromNodeId": "compositor-node:2041292736", + "fromSocket": "Color", + "toNodeId": "compositor-node:2012536477", + "toSocket": "Fac" + } + ] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1164-001/manifest.json b/tests/golden/WBV2-P1164-001/manifest.json new file mode 100644 index 000000000..7117ba589 --- /dev/null +++ b/tests/golden/WBV2-P1164-001/manifest.json @@ -0,0 +1,104 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1164-001", + "parentTask": "WBV2-P1164-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1164-000/manifest.json", + "sha256": "3fca2b6b73f7cb24d97fda30806d2c4777acc540fb0ee60ed3475386b33654b1" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "sha256": "0f5275470a1414d6d3cdb86f75af873ad39fee4b3c60883a8fc3cea7730d1274" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "sha256": "78ae9c518189ec050abd558ff980c214f1c89f9e03fc0b22afc720e8371a9aa5" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "sha256": "8e9b6f675e615a2f5f4ece4904d90702996fd5c326c511c480d6d31f42fd1b10" + }, + "source4": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source5": { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "sha256": "b573ac61d289a63389631bc80dd4195acf10c7383c4db3f2adde0e09aa01c9d7" + }, + "source6": { + "path": "tests/files/web/compositor_node_batch_scene.blend", + "sha256": "af7ab364d642fd6ac6f7f0b441e8bf82df6d1725a5fdbdd60f3400d40adeb647" + }, + "source7": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json", + "sha256": "968cf4db7951a790d72958231ba6a903041ac39a53b726d0930f12e64f6f8ab2" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1164-001/module-receipt.json", + "sha256": "70065fa48869f17c7fa1087d654abe03f5c1602910c5999c374e2d5c2d14176d" + }, + "status": { + "path": "docs/status/WBV2-P1164-001.md", + "sha256": "b00c12b78c395e8708860310522e9595288267c0f826c8ea5761c32d32384f0d" + }, + "log": { + "path": "tests/golden/WBV2-P1164-001/module-run.log", + "sha256": "f343ba4a82d04270248c4cfd39be3cce0ef27de0fe421a425fe68696b465ef65" + }, + "plan": { + "path": "tests/golden/WBV2-P1164-000/module-execution-plan.json", + "sha256": "76471d685f2eb29fb33372d38e17292f69697807dce64a0bc2b6cdcdb589215a" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1164-001/task-context.json", + "sha256": "866f054538286637d6324e40497d763a68236c43b3159fb636e24c4542401110" + } + }, + "assertions": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "positiveCases": 6, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 529, + "dynamicUnverifiedUnits": 3216, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1164-001/module-receipt.json b/tests/golden/WBV2-P1164-001/module-receipt.json new file mode 100644 index 000000000..02e225fa3 --- /dev/null +++ b/tests/golden/WBV2-P1164-001/module-receipt.json @@ -0,0 +1,143 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1164-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc": "0f5275470a1414d6d3cdb86f75af873ad39fee4b3c60883a8fc3cea7730d1274", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc": "78ae9c518189ec050abd558ff980c214f1c89f9e03fc0b22afc720e8371a9aa5", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc": "8e9b6f675e615a2f5f4ece4904d90702996fd5c326c511c480d6d31f42fd1b10", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc": "0f5275470a1414d6d3cdb86f75af873ad39fee4b3c60883a8fc3cea7730d1274", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc": "78ae9c518189ec050abd558ff980c214f1c89f9e03fc0b22afc720e8371a9aa5", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc": "8e9b6f675e615a2f5f4ece4904d90702996fd5c326c511c480d6d31f42fd1b10", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "unchanged": true + }, + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json", + "manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c", + "reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2" + } + ], + "cases": { + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ] + }, + "commands": [ + { + "command": "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "exitCode": 0, + "durationMs": 142 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3312 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3879 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts", + "exitCode": 0, + "durationMs": 2794 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10127, + "reusePolicy": "hash_bound_receipt" + }, + "inventory": { + "historical": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "dynamic": { + "path": "tests/golden/WBV2/dynamic-inventory.json", + "sha256": "512ed0b2c2e370b7e08b5096faa4cb084cb4cc19e9c5785cb3efa57502e3dab8", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 529, + "unverifiedUnits": 3216 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1164-001/module-run.log b/tests/golden/WBV2-P1164-001/module-run.log new file mode 100644 index 000000000..04b36c804 --- /dev/null +++ b/tests/golden/WBV2-P1164-001/module-run.log @@ -0,0 +1,49 @@ +> source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm +ninja: no work to do. + +> npm --prefix web run typecheck + +> blender-web-editor@0.1.0-rc.1 typecheck +> tsc -p tsconfig.json --noEmit + + +> npm --prefix web run build + +> blender-web-editor@0.1.0-rc.1 build +> tsc -p tsconfig.json && vite build --config app/vite.config.ts + +vite v8.2.0 building client environment for production... + transforming...✓ 102 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.46 kB │ gzip: 0.29 kB +dist/assets/storage.worker-D9TqXsGS.js 66.59 kB +dist/assets/web-engine.worker-ynL11m10.js 362.11 kB +dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB +dist/assets/web_engine-C04Dp4ba.wasm 16,243.50 kB │ gzip: 3,858.52 kB +dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB +dist/assets/index-B1m0FaKy.js 1,190.30 kB │ gzip: 316.69 kB + +✓ built in 487ms +[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. +[plugin builtin:vite-reporter] +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. + +> WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='["CompositorNodeTransform","CompositorNodeBlur","CompositorNodeAlphaOver","VIEWER"]' WBV2_BATCH_UNITS='["node:CompositorNodeTransform","node:CompositorNodeBlur","node:CompositorNodeAlphaOver"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/compositor-main-reader-production.spec.ts:15:1 › WBV2-P1104-000 reads compositor NodeTree and links from Blender Main without JS execution (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1235149) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +[WebServer] (Use `node --trace-warnings ...` to show where the warning was created) +(node:1235203) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) diff --git a/tests/golden/WBV2-P1164-001/task-context.json b/tests/golden/WBV2-P1164-001/task-context.json new file mode 100644 index 000000000..f9cc12772 --- /dev/null +++ b/tests/golden/WBV2-P1164-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1164-001", + "parentTask": "WBV2-P1164-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeTransform, CompositorNodeBlur, CompositorNodeAlphaOver, CompositorNodeViewer 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:COMPOSITOR_NATIVE_NODE_BATCH", + "ownerFamily": "MEDIA", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1164-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788476827923795621", + "sha256": "1576094547e91b4d12df16b6ad23ed3124d80a22781ae744fecdf9fe347ab226" + }, + "docs/tasks/WBV2-P1164-001.md": { + "path": "docs/tasks/WBV2-P1164-001.md", + "exists": true, + "bytes": 2503, + "mtime_ns": "1788476817335926263", + "sha256": "edfd7bc14b8c5d5d8c36744596bb3134bca8fea07829086a396933d077fc95a0" + }, + "tests/golden/WBV2-P1164-000/manifest.json": { + "path": "tests/golden/WBV2-P1164-000/manifest.json", + "exists": true, + "bytes": 1592, + "mtime_ns": "1788476817336403467", + "sha256": "3fca2b6b73f7cb24d97fda30806d2c4777acc540fb0ee60ed3475386b33654b1" + }, + "docs/status/WBV2-P1164-000.md": { + "path": "docs/status/WBV2-P1164-000.md", + "exists": true, + "bytes": 360, + "mtime_ns": "1788476817336076181", + "sha256": "5a905d3db60d815249b5a5452a4321b29daa05afa677190533c17ed1f45fa8c9" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1419, + "contextRemainingTokens": 354 + }, + "source": { + "bytes": 8485, + "tokens": 2122 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender/modifiers/intern/", + "bytes": 10155, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "bytes": 521651, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "bytes": 314614, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/compositor_node_batch_scene.blend", + "bytes": 98715, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "bytes": 3876, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1164-001/module-receipt.json", + "bytes": 6193, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1164-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1164-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1164-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P1164-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1164-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1164-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1164-001.md", + "tests/golden/WBV2-P1164-000/manifest.json", + "docs/status/WBV2-P1164-000.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P1164-000", + "parentTask": "WBV2-P1163-001", + "status": "done", + "nextTask": "WBV2-P1164-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1164-000 status", + "- task: `WBV2-P1164-000`; parent: `WBV2-P1163-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `COMPOSITOR_NATIVE_NODE_BATCH` (3 units)", + "- dynamic inventory: `3745` units; verified `526`; unverified `3219`; bound delta `0`", + "- nextTask: `WBV2-P1164-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2503, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 626 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1164-001.md", + "bytes": 2503, + "lines": 49, + "tokens": 626 + }, + { + "path": "tests/golden/WBV2-P1164-000/manifest.json", + "bytes": 1592, + "lines": 49, + "tokens": 398 + }, + { + "path": "docs/status/WBV2-P1164-000.md", + "bytes": 360, + "lines": 8, + "tokens": 90 + } + ], + "sourceTokens": 2122, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2122, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3146, + "serializedContextTokens": 671, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index ec0948e90..31a421292 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -105,3 +105,5 @@ {"id":"WBV2-P1162-001","gapId":"MODIFIER_SHAPEKEY_READER_BATCH","ownerFamily":"MODIFIER","sourceTask":"1162","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} {"id":"WBV2-P1163-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1163","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1163-001","gapId":"COMPOSITOR_NODE_READER_BATCH","ownerFamily":"MEDIA","sourceTask":"1163","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} +{"id":"WBV2-P1164-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1164","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1164-001","gapId":"COMPOSITOR_NATIVE_NODE_BATCH","ownerFamily":"MEDIA","sourceTask":"1164","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 26c94b58d..e7916222b 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1163-000/module-execution-plan.json","sha256":"e703842ed526aea3f4ee63f3e6aa6d7b067dea7fb4f99c8ede39dc0feb0136c0"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"ad716e193fe3e3eb385258e7be3d77a0717935bcb5ec24e5952384e61f78a44b"},"taskCount":107,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1164-000/module-execution-plan.json","sha256":"76471d685f2eb29fb33372d38e17292f69697807dce64a0bc2b6cdcdb589215a"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"b843e0599d1056ef85087b7b9f844b9567658573a679e28d74f067b33d152f44"},"taskCount":109,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":null}}}