diff options
author | Andy Nichols <andy.nichols@qt.io> | 2025-06-10 12:58:18 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@qt.io> | 2025-06-10 12:59:03 +0200 |
commit | 488a2f7af2920295ada886f113a0d563dab79b8d (patch) | |
tree | 60618a0947d45081caf6c5038cee9706e4af4ae0 /test | |
parent | 647f94648c0ae24b9c6684383a9dbbc0e2fc23b7 (diff) | |
parent | fb375dd8c0a032106a2122815fb18dffe0283721 (diff) |
Merge tag 'v6.0.2' into qt6_assimpqt6_assimp
Change-Id: I70ab8ef899f760cfa3ef8406419ecdb976d6ffc3
Diffstat (limited to 'test')
239 files changed, 3707 insertions, 200 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7b7fd850a..392951b29 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,6 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- -# Copyright (c) 2006-2024, assimp team +# Copyright (c) 2006-2025, assimp team # # All rights reserved. # @@ -86,6 +86,7 @@ SET( COMMON unit/TestModelFactory.h unit/utTypes.cpp unit/utVersion.cpp + unit/Common/utParsingUtils.cpp unit/utProfiler.cpp unit/utSharedPPData.cpp unit/utStringUtils.cpp @@ -100,6 +101,7 @@ SET( COMMON unit/Common/utBase64.cpp unit/Common/utHash.cpp unit/Common/utBaseProcess.cpp + unit/Common/utLogger.cpp ) SET(Geometry @@ -148,7 +150,6 @@ SET( IMPORTERS #unit/utM3DImportExport.cpp unit/utMDCImportExport.cpp unit/utAssbinImportExport.cpp - unit/utUSDImport.cpp unit/ImportExport/utAssjsonImportExport.cpp unit/ImportExport/utCOBImportExport.cpp unit/ImportExport/utOgreImportExport.cpp @@ -169,6 +170,12 @@ SET( IMPORTERS unit/ImportExport/Pbrt/utPbrtImportExport.cpp ) +if(ASSIMP_BUILD_USD_IMPORTER) + list( APPEND IMPORTERS + unit/utUSDImport.cpp + ) +endif() + SET( MATERIAL unit/utMaterialSystem.cpp ) diff --git a/test/models/AC/ref/README.md b/test/models/AC/ref/README.md new file mode 100644 index 000000000..0034c2600 --- /dev/null +++ b/test/models/AC/ref/README.md @@ -0,0 +1,6 @@ +# AC 3D model reference images + +## sample_subdiv.ac +Note that there appear to be some small holes in the surface in a few places + +<img alt="sample_subdiv.ac (as solid)" src="screenshots/sample_subdiv_ac_solid.png" width=180 /> diff --git a/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png b/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png Binary files differnew file mode 100644 index 000000000..61a14edac --- /dev/null +++ b/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png diff --git a/test/models/ASE/ref/README.md b/test/models/ASE/ref/README.md new file mode 100644 index 000000000..2f6d7aa5f --- /dev/null +++ b/test/models/ASE/ref/README.md @@ -0,0 +1,18 @@ +# ASE 3D model reference images + +## MotionCaptureROM.ase + +### Model is pure node animation of separate rigid meshes, no bones/mesh deformation +Note: this model has no bones/skeleton; the body is formed of separate rigid meshes +for each segment (e.g. upper arm, lower arm, upper leg, lower leg are all separate meshses) +and animation is entirely driven by changing node transformations over the animation timeline, +rather than deforming vertices via bones and associated weights. + +### Artifacts +Animation has known artifacts, as stated in [MotionCaptureROM.source.txt](../MotionCaptureROM.source.txt): +``` +NOTE: The errors in the middle of the animation are caused by problems during recording, +it's not an importer issue. +``` + +<img alt="MotionCaptureROM.ase" src="screenshots/MotionCaptureROM_ase.gif" width=320 /> diff --git a/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif b/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif Binary files differnew file mode 100644 index 000000000..a4978b11b --- /dev/null +++ b/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif diff --git a/test/models/BVH/ref/README.md b/test/models/BVH/ref/README.md new file mode 100644 index 000000000..57d4496b9 --- /dev/null +++ b/test/models/BVH/ref/README.md @@ -0,0 +1,16 @@ +# BVH 3D model reference images + +## 01_01.bvh +Three hops forward, turn around, three hops back, turn around, three hops forward + +<img alt="01_01.bvh" src="screenshots/01_01_bvh.gif" width=180 /> + +## 01_03.bvh +Climb step ladder, hang on bar, climb step ladder, hang on bar + +<img alt="01_03.bvh" src="screenshots/01_03_bvh.gif" width=320 /> + +## Boxing_Toes.bvh +Boxer warming up, throwing punches, getting hit, going to canvas + +<img alt="Boxing_Toes.bvh" src="screenshots/Boxing_Toes_bvh.gif" width=180 /> diff --git a/test/models/BVH/ref/screenshots/01_01_bvh.gif b/test/models/BVH/ref/screenshots/01_01_bvh.gif Binary files differnew file mode 100644 index 000000000..604be85b1 --- /dev/null +++ b/test/models/BVH/ref/screenshots/01_01_bvh.gif diff --git a/test/models/BVH/ref/screenshots/01_03_bvh.gif b/test/models/BVH/ref/screenshots/01_03_bvh.gif Binary files differnew file mode 100644 index 000000000..88c0a4408 --- /dev/null +++ b/test/models/BVH/ref/screenshots/01_03_bvh.gif diff --git a/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif b/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif Binary files differnew file mode 100644 index 000000000..faba5edc5 --- /dev/null +++ b/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif diff --git a/test/models/COB/molecule_ascii.cob b/test/models/COB/molecule_ascii.cob index 9185e741e..f4f4c783d 100644 --- a/test/models/COB/molecule_ascii.cob +++ b/test/models/COB/molecule_ascii.cob @@ -1170,7 +1170,7 @@ Object Mode Off 0 Mat1 V0.08 Id 497131204 Parent 58548212 Size 00000083 mat# 0 shader: phong facet: auto40 -rgb 1,1,1 +rgb 1.0,1.0,1.0 alpha 1 ka 0 ks 0.1 exp 0 ior 1 ShBx V0.04 Id 497131205 Parent 497131204 Size 00000605 Shader class: color @@ -1758,7 +1758,7 @@ Object Mode Off 0 Mat1 V0.08 Id 497168220 Parent 57850740 Size 00000083 mat# 0 shader: phong facet: auto40 -rgb 1,1,1 +rgb 1.0,1.0,1.0 alpha 1 ka 0 ks 0.1 exp 0 ior 1 ShBx V0.04 Id 497168221 Parent 497168220 Size 00000605 Shader class: color @@ -2346,7 +2346,7 @@ Object Mode Off 0 Mat1 V0.08 Id 497153380 Parent 497235148 Size 00000083 mat# 0 shader: phong facet: auto40 -rgb 1,1,1 +rgb 1.0,1.0,1.0 alpha 1 ka 0 ks 0.1 exp 0 ior 1 ShBx V0.04 Id 497153381 Parent 497153380 Size 00000605 Shader class: color diff --git a/test/models/COB/ref/README.md b/test/models/COB/ref/README.md new file mode 100644 index 000000000..3fc4b137b --- /dev/null +++ b/test/models/COB/ref/README.md @@ -0,0 +1,4 @@ +# COB 3D model reference images + +## molecule_ascii.cob +<img alt="molecule_ascii.cob" src="screenshots/molecule_ascii_cob.png" width=180 /> diff --git a/test/models/COB/ref/screenshots/molecule_ascii_cob.png b/test/models/COB/ref/screenshots/molecule_ascii_cob.png Binary files differnew file mode 100644 index 000000000..2852c5f28 --- /dev/null +++ b/test/models/COB/ref/screenshots/molecule_ascii_cob.png diff --git a/test/models/CSM/ref/README.md b/test/models/CSM/ref/README.md new file mode 100644 index 000000000..5b757f49f --- /dev/null +++ b/test/models/CSM/ref/README.md @@ -0,0 +1,4 @@ +# CSM 3D model reference images + +## ThomasFechten.csm +<img alt="ThomasFechten.csm" src="screenshots/ThomasFechten_csm.gif" width=180 /> diff --git a/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif b/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif Binary files differnew file mode 100644 index 000000000..365aea2f8 --- /dev/null +++ b/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif diff --git a/test/models/Collada/ref/README.md b/test/models/Collada/ref/README.md new file mode 100644 index 000000000..92f74960a --- /dev/null +++ b/test/models/Collada/ref/README.md @@ -0,0 +1,6 @@ +# Collada 3D model reference images + +## human.zae +Compressed Collada file (.zae) + +<img alt="human.zae" src="screenshots/human_zae.png" width=180 /> diff --git a/test/models/Collada/ref/screenshots/human_zae.png b/test/models/Collada/ref/screenshots/human_zae.png Binary files differnew file mode 100644 index 000000000..8d7945c3a --- /dev/null +++ b/test/models/Collada/ref/screenshots/human_zae.png diff --git a/test/models/HMP/ref/README.md b/test/models/HMP/ref/README.md new file mode 100644 index 000000000..aa5ccf1d5 --- /dev/null +++ b/test/models/HMP/ref/README.md @@ -0,0 +1,4 @@ +# HMP 3D model reference images + +## terrain.hmp +<img alt="terrain.hmp" src="screenshots/terrain_hmp.png" width=180 /> diff --git a/test/models/HMP/ref/screenshots/terrain_hmp.png b/test/models/HMP/ref/screenshots/terrain_hmp.png Binary files differnew file mode 100644 index 000000000..d7c8dcb0c --- /dev/null +++ b/test/models/HMP/ref/screenshots/terrain_hmp.png diff --git a/test/models/IQM/ref/README.md b/test/models/IQM/ref/README.md new file mode 100644 index 000000000..78986b04d --- /dev/null +++ b/test/models/IQM/ref/README.md @@ -0,0 +1,4 @@ +# IQM 3D model reference images + +## mrfixit.iqm +<img alt="mrfixit.iqm" src="screenshots/mrfixit_iqm.png" width=180 /> diff --git a/test/models/IQM/ref/screenshots/mrfixit_iqm.png b/test/models/IQM/ref/screenshots/mrfixit_iqm.png Binary files differnew file mode 100644 index 000000000..cb57f1694 --- /dev/null +++ b/test/models/IQM/ref/screenshots/mrfixit_iqm.png diff --git a/test/models/IRR/ref/README.md b/test/models/IRR/ref/README.md new file mode 100644 index 000000000..b4860303e --- /dev/null +++ b/test/models/IRR/ref/README.md @@ -0,0 +1,14 @@ +# IRR 3D model reference images + +## scenegraphAnimMod_UTF16LE.irr + +### Animation "AnimationSet0" +Dwarf animated; primitive objects not animated + +<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr.gif" width=320 /> +<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif" width=180 /> + +### Animation "Irr_GlobalAnimChannel" +Primitive objects animate; dwarf not animated (Animation playback sped up significantly) + +<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif" width=180 /> diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif Binary files differnew file mode 100644 index 000000000..778d7f1bf --- /dev/null +++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif Binary files differnew file mode 100644 index 000000000..4db9e7042 --- /dev/null +++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif Binary files differnew file mode 100644 index 000000000..fea75b2ae --- /dev/null +++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif diff --git a/test/models/MD2/ref/README.md b/test/models/MD2/ref/README.md new file mode 100644 index 000000000..7f4b49c43 --- /dev/null +++ b/test/models/MD2/ref/README.md @@ -0,0 +1,7 @@ +# MD2 3D model reference images + +## faerie.md2 +<img alt="faerie.md2" src="screenshots/faerie_md2.png" width=180 /> + +## sydney.md2 +<img alt="sydney.md2" src="screenshots/sydney_md2.png" width=180 /> diff --git a/test/models/MD2/ref/screenshots/faerie_md2.png b/test/models/MD2/ref/screenshots/faerie_md2.png Binary files differnew file mode 100644 index 000000000..e2385ccea --- /dev/null +++ b/test/models/MD2/ref/screenshots/faerie_md2.png diff --git a/test/models/MD2/ref/screenshots/sydney_md2.png b/test/models/MD2/ref/screenshots/sydney_md2.png Binary files differnew file mode 100644 index 000000000..b8616a8f6 --- /dev/null +++ b/test/models/MD2/ref/screenshots/sydney_md2.png diff --git a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff b/test/models/NFF/ManyEarthsNotJustOne.nff index 1f41dc198..1f41dc198 100644 --- a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff +++ b/test/models/NFF/ManyEarthsNotJustOne.nff diff --git a/test/models/NFF/NFF/WithCamera.nff b/test/models/NFF/WithCamera.nff index 765dddc27..765dddc27 100644 --- a/test/models/NFF/NFF/WithCamera.nff +++ b/test/models/NFF/WithCamera.nff diff --git a/test/models/NFF/NFF/cone.nff b/test/models/NFF/cone.nff index 20d02b259..f6f063ae4 100644 --- a/test/models/NFF/NFF/cone.nff +++ b/test/models/NFF/cone.nff @@ -1,6 +1,6 @@ #red -f 1.0 0.0 0.0 0.5 45.2776 0 1 cantfindme.png +f 1.0 0.0 0.0 0.5 0.5 45.2776 0 1 cantfindme.png tess 4 diff --git a/test/models/NFF/NFF/cylinder.nff b/test/models/NFF/cylinder.nff index 85a8ce79c..85a8ce79c 100644 --- a/test/models/NFF/NFF/cylinder.nff +++ b/test/models/NFF/cylinder.nff diff --git a/test/models/NFF/NFF/dodecahedron.nff b/test/models/NFF/dodecahedron.nff index 6ab505178..6ab505178 100644 --- a/test/models/NFF/NFF/dodecahedron.nff +++ b/test/models/NFF/dodecahedron.nff diff --git a/test/models/NFF/NFF/earthCylindric.jpg b/test/models/NFF/earthCylindric.jpg Binary files differindex da9688b44..da9688b44 100644 --- a/test/models/NFF/NFF/earthCylindric.jpg +++ b/test/models/NFF/earthCylindric.jpg diff --git a/test/models/NFF/NFF/earthSpherical.jpg b/test/models/NFF/earthSpherical.jpg Binary files differindex 3419e8071..3419e8071 100644 --- a/test/models/NFF/NFF/earthSpherical.jpg +++ b/test/models/NFF/earthSpherical.jpg diff --git a/test/models/NFF/NFF/hexahedron.nff b/test/models/NFF/hexahedron.nff index afa62deb4..afa62deb4 100644 --- a/test/models/NFF/NFF/hexahedron.nff +++ b/test/models/NFF/hexahedron.nff diff --git a/test/models/NFF/NFF/octahedron.nff b/test/models/NFF/octahedron.nff index eac88e7ad..eac88e7ad 100644 --- a/test/models/NFF/NFF/octahedron.nff +++ b/test/models/NFF/octahedron.nff diff --git a/test/models/NFF/NFF/positionTest.nff b/test/models/NFF/positionTest.nff index d0715a00a..d0715a00a 100644 --- a/test/models/NFF/NFF/positionTest.nff +++ b/test/models/NFF/positionTest.nff diff --git a/test/models/NFF/ref/README.md b/test/models/NFF/ref/README.md new file mode 100644 index 000000000..ae107c4c4 --- /dev/null +++ b/test/models/NFF/ref/README.md @@ -0,0 +1,4 @@ +# NFF 3D model reference images + +## cone.nff +<img alt="cone.nff" src="screenshots/cone_nff.png" width=180 /> diff --git a/test/models/NFF/ref/screenshots/cone_nff.png b/test/models/NFF/ref/screenshots/cone_nff.png Binary files differnew file mode 100644 index 000000000..f5aff6745 --- /dev/null +++ b/test/models/NFF/ref/screenshots/cone_nff.png diff --git a/test/models/NFF/NFF/spheres.nff b/test/models/NFF/spheres.nff index 80972cb43..80972cb43 100644 --- a/test/models/NFF/NFF/spheres.nff +++ b/test/models/NFF/spheres.nff diff --git a/test/models/NFF/NFF/tetrahedron.nff b/test/models/NFF/tetrahedron.nff index 78c3bdf79..78c3bdf79 100644 --- a/test/models/NFF/NFF/tetrahedron.nff +++ b/test/models/NFF/tetrahedron.nff diff --git a/test/models/OBJ/folder/mtl_different_folder.mtl b/test/models/OBJ/folder/mtl_different_folder.mtl new file mode 100644 index 000000000..9fbaa3d78 --- /dev/null +++ b/test/models/OBJ/folder/mtl_different_folder.mtl @@ -0,0 +1,13 @@ + +# Example for github issue #2355: {OBJ} mtllib with a path == can't find texture file + +newmtl Whatever +Ka 0 0 0 +Kd 0.141176 0.184314 0.411765 +Ks 0 0 0 +Ni 1 +Ns 400 +Tf 1 1 1 +d 1 +map_Kd image.jpg + diff --git a/test/models/OBJ/mtl_different_folder.obj b/test/models/OBJ/mtl_different_folder.obj new file mode 100644 index 000000000..afffa41b0 --- /dev/null +++ b/test/models/OBJ/mtl_different_folder.obj @@ -0,0 +1,31 @@ +# Vertices: 8 +# Points: 0 +# Lines: 0 +# Faces: 6 +# Materials: 1 + +o 1 +mtllib folder/mtl_different_folder.mtl + +# Vertex list + +v -0.5 -0.5 0.5 +v -0.5 -0.5 -0.5 +v -0.5 0.5 -0.5 +v -0.5 0.5 0.5 +v 0.5 -0.5 0.5 +v 0.5 -0.5 -0.5 +v 0.5 0.5 -0.5 +v 0.5 0.5 0.5 + +# Point/Line/Face list + +usemtl Whatever +f 4 3 2 1 +f 2 6 5 1 +f 3 7 6 2 +f 8 7 3 4 +f 5 8 4 1 +f 6 7 8 5 + +# End of file diff --git a/test/models/OpenGEX/texture/Concrete.tga b/test/models/OpenGEX/texture/Concrete.tga Binary files differnew file mode 100644 index 000000000..99df7364f --- /dev/null +++ b/test/models/OpenGEX/texture/Concrete.tga diff --git a/test/models/PLY/cube_binary_starts_with_nl.ply b/test/models/PLY/cube_binary_starts_with_nl.ply Binary files differnew file mode 100644 index 000000000..0eed84a5c --- /dev/null +++ b/test/models/PLY/cube_binary_starts_with_nl.ply diff --git a/test/models/TER/ref/README.md b/test/models/TER/ref/README.md new file mode 100644 index 000000000..e1994ebd6 --- /dev/null +++ b/test/models/TER/ref/README.md @@ -0,0 +1,7 @@ +# TER 3D model reference images + +## RealisticTerrain.ter +<img alt="RealisticTerrain.ter" src="screenshots/RealisticTerrain_ter.png" width=180 /> + +## RealisticTerrain_Large.ter +<img alt="RealisticTerrain_Large.ter" src="screenshots/RealisticTerrain_Large_ter.png" width=180 /> diff --git a/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png b/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png Binary files differnew file mode 100644 index 000000000..e5c6ff5c2 --- /dev/null +++ b/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png diff --git a/test/models/TER/ref/screenshots/RealisticTerrain_ter.png b/test/models/TER/ref/screenshots/RealisticTerrain_ter.png Binary files differnew file mode 100644 index 000000000..b39185275 --- /dev/null +++ b/test/models/TER/ref/screenshots/RealisticTerrain_ter.png diff --git a/test/models/USD/MotionCaptureROM.usdc b/test/models/USD/MotionCaptureROM.usdc Binary files differnew file mode 100644 index 000000000..01598ca0d --- /dev/null +++ b/test/models/USD/MotionCaptureROM.usdc diff --git a/test/models/USD/README.md b/test/models/USD/README.md new file mode 100644 index 000000000..500a0cad1 --- /dev/null +++ b/test/models/USD/README.md @@ -0,0 +1,8 @@ +# USD model files + +## MotionCaptureROM.usdc +Converted bundled .wrl test model: + https://github.com/assimp/assimp/blob/master/test/models/WRL/MotionCaptureROM.WRL +to .usdc format via website: + https://imagetostl.com/convert/file/wrl/to/usd#convert +(As of Oct 2024, animations have not been verified as present or correct) diff --git a/test/models/USD/ref/README.md b/test/models/USD/ref/README.md new file mode 100644 index 000000000..0da8dfa1c --- /dev/null +++ b/test/models/USD/ref/README.md @@ -0,0 +1,4 @@ +# USD 3D model reference images + +## MotionCaptureROM.usdc +<img alt="MotionCaptureROM.usdc" src="screenshots/MotionCaptureROM_usdc.png" width=180 /> diff --git a/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png b/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png Binary files differnew file mode 100644 index 000000000..d924ccaa6 --- /dev/null +++ b/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png diff --git a/test/models/WRL/HelloWorld.wrl b/test/models/WRL/HelloWorld.wrl new file mode 100644 index 000000000..e6c71b6a5 --- /dev/null +++ b/test/models/WRL/HelloWorld.wrl @@ -0,0 +1,87 @@ +#VRML V2.0 utf8 +# X3D-to-VRML-97 XSL translation autogenerated by X3dToVrml97.xslt +# https://www.web3d.org/x3d/content/X3dToVrml97.xslt +# Generated using XSLT processor: Saxonica + +# [X3D] VRML V3.3 utf8 +# PROFILE Immersive +# [X3D] version=3.3 +# [X3D] noNamespaceSchemaLocation=https://www.web3d.org/specifications/x3d-3.3.xsd +# [head] + +# Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON +# META "title" "HelloWorld.x3d" +# META "description" "Simple X3D model example: Hello World!" +# META "created" "30 October 2000" +# META "modified" "9 July 2023" +# META "creator" "Don Brutzman" +# META "Image" "HelloWorld.tall.png" +# META "reference" "https://en.wikipedia.org/wiki/Hello_world" +# META "reference" "https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program" +# META "reference" "https://en.wikipedia.org/wiki/\"Hello,_World!\"_program" +# META "reference" "https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world" +# META "reference" "https://www.HelloWorldExample.net" +# META "reference" "https://www.web3d.org" +# META "reference" "https://www.web3d.org/realtime-3d/news/internationalization-x3d" +# META "reference" "https://www.web3d.org/x3d/content/examples/HelloWorld.x3d" +# META "reference" "https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d" +# META "identifier" "https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d" +# META "license" "https://www.web3d.org/x3d/content/examples/license.html" +# META "generator" "X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit" +# META "reference" "HelloWorld.wrl" +# META "reference" "HelloWorld.x3dv" +# META "reference" "HelloWorld.x3db" +# META "reference" "HelloWorld.xhtml" +# META "reference" "HelloWorld.json" + +# [Scene] ========== ========== ========== + +NavigationInfo { type [ "EXAMINE" "ANY" ] } ### Default X3D NavigationInfo + +# Example scene to illustrate X3D nodes and fields (XML elements and attributes) +WorldInfo { + info [ "Example scene to illustrate a simple X3D model" ] + title "Hello World!" +} +Group { + children [ + DEF ViewUpClose Viewpoint { + centerOfRotation 0 -1 0 + description "Hello world!" + position 0 -1 7 + } + Transform { + rotation 0 1 0 3 + children [ + Shape { + geometry Sphere { + } + appearance Appearance { + material DEF MaterialOffWhite Material { + diffuseColor 0.980392 0.976471 0.964706 + } + texture DEF ImageCloudlessEarth ImageTexture { + url [ "earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif" ] + } + } + } + ] + } + Transform { + translation 0 -2 0 + children [ + Shape { + geometry DEF TextMessage Text { + string [ "Hello" "world!" ] + fontStyle FontStyle { + justify [ "MIDDLE" "MIDDLE" ] + } + } + appearance Appearance { + material USE MaterialOffWhite + } + } + ] + } + ] +} diff --git a/test/models/WRL/README.md b/test/models/WRL/README.md new file mode 100644 index 000000000..744d2485e --- /dev/null +++ b/test/models/WRL/README.md @@ -0,0 +1,6 @@ +# WRL models + +X3D is a modern superset of the old (VRML) WRL format + +# HelloWorld.wrl +Downloaded from [HelloWorld.wrl](http://www.web3d.org/x3d/content/examples/HelloWorld.wrl) diff --git a/test/models/WRL/earth-topo.png b/test/models/WRL/earth-topo.png Binary files differnew file mode 100644 index 000000000..1749cb835 --- /dev/null +++ b/test/models/WRL/earth-topo.png diff --git a/test/models/WRL/ref/README.md b/test/models/WRL/ref/README.md new file mode 100644 index 000000000..ff0205010 --- /dev/null +++ b/test/models/WRL/ref/README.md @@ -0,0 +1,4 @@ +# WRL 3D model reference images + +## HelloWorld.wrl +<img alt="HelloWorld.wrl" src="screenshots/HelloWorld_wrl.png" width=180 /> diff --git a/test/models/WRL/ref/screenshots/HelloWorld_wrl.png b/test/models/WRL/ref/screenshots/HelloWorld_wrl.png Binary files differnew file mode 100644 index 000000000..54cfd704c --- /dev/null +++ b/test/models/WRL/ref/screenshots/HelloWorld_wrl.png diff --git a/test/models/X/ref/README.md b/test/models/X/ref/README.md new file mode 100644 index 000000000..4a3944ab9 --- /dev/null +++ b/test/models/X/ref/README.md @@ -0,0 +1,7 @@ +# X 3D model reference images + +## BCN_Epileptic.X +<img alt="BCN_Epileptic.X" src="screenshots/BCN_Epileptic_X.gif" width=180 /> + +## Testwuson.X playing animation "Wuson_Run" +<img alt="Testwuson.X" src="screenshots/Testwuson_X_anim_Wuson_Run.gif" width=180 /> diff --git a/test/models/X/ref/screenshots/BCN_Epileptic_X.gif b/test/models/X/ref/screenshots/BCN_Epileptic_X.gif Binary files differnew file mode 100644 index 000000000..fb275c7c2 --- /dev/null +++ b/test/models/X/ref/screenshots/BCN_Epileptic_X.gif diff --git a/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif b/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif Binary files differnew file mode 100644 index 000000000..4f25c0bac --- /dev/null +++ b/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif diff --git a/test/models/X3D/HelloWorld.x3d b/test/models/X3D/HelloWorld.x3d new file mode 100644 index 000000000..030e2f36c --- /dev/null +++ b/test/models/X3D/HelloWorld.x3d @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd"> +<X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'> + <head> + <!-- Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON --> + <meta content='HelloWorld.x3d' name='title'/> + <meta content='Simple X3D model example: Hello World!' name='description'/> + <meta content='30 October 2000' name='created'/> + <meta content='9 July 2023' name='modified'/> + <meta content='Don Brutzman' name='creator'/> + <meta content='HelloWorld.tall.png' name='Image'/> + <meta content='https://en.wikipedia.org/wiki/Hello_world' name='reference'/> + <meta content='https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program' name='reference'/> + <meta content='https://en.wikipedia.org/wiki/"Hello,_World!"_program' name='reference'/> + <meta content='https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world' name='reference'/> + <meta content='https://www.HelloWorldExample.net' name='reference'/> + <meta content='https://www.web3d.org' name='reference'/> + <meta content='https://www.web3d.org/realtime-3d/news/internationalization-x3d' name='reference'/> + <meta content='https://www.web3d.org/x3d/content/examples/HelloWorld.x3d' name='reference'/> + <meta content='https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d' name='reference'/> + <meta content='https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d' name='identifier'/> + <meta content='https://www.web3d.org/x3d/content/examples/license.html' name='license'/> + <meta content='X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit' name='generator'/> + <meta content='HelloWorld.wrl' name='reference'/> + <meta content='HelloWorld.x3dv' name='reference'/> + <meta content='HelloWorld.x3db' name='reference'/> + <meta content='HelloWorld.xhtml' name='reference'/> + <meta content='HelloWorld.json' name='reference'/> + </head> + <Scene> + <!-- Example scene to illustrate X3D nodes and fields (XML elements and attributes) --> + <WorldInfo info='"Example scene to illustrate a simple X3D model"' title='Hello World!'/> + <Group> + <Viewpoint DEF='ViewUpClose' centerOfRotation='0 -1 0' description='Hello world!' position='0 -1 7'/> + <Transform rotation='0 1 0 3'> + <Shape> + <Sphere/> + <Appearance> + <!-- https://htmlcolorcodes.com/colors/off-white --> + <Material DEF='MaterialOffWhite' diffuseColor='0.980392 0.976471 0.964706'/> + <ImageTexture DEF='ImageCloudlessEarth' url='"earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif"'/> + </Appearance> + </Shape> + </Transform> + <Transform translation='0 -2 0'> + <Shape> + <Text DEF='TextMessage' string='"Hello" "world!"'> + <FontStyle justify='"MIDDLE" "MIDDLE"'/> + </Text> + <Appearance> + <Material USE='MaterialOffWhite'/> + </Appearance> + </Shape> + </Transform> + </Group> + </Scene> +</X3D>
\ No newline at end of file diff --git a/test/models/X3D/README.md b/test/models/X3D/README.md new file mode 100644 index 000000000..dd843871e --- /dev/null +++ b/test/models/X3D/README.md @@ -0,0 +1,4 @@ +# X3D models + +# HelloWorld.x3d +Downloaded from [HelloWorld.x3d](http://www.web3d.org/x3d/content/examples/HelloWorld.x3d) diff --git a/test/models/X3D/earth-topo.png b/test/models/X3D/earth-topo.png Binary files differnew file mode 100644 index 000000000..1749cb835 --- /dev/null +++ b/test/models/X3D/earth-topo.png diff --git a/test/models/X3D/ref/README.md b/test/models/X3D/ref/README.md new file mode 100644 index 000000000..dc80e3064 --- /dev/null +++ b/test/models/X3D/ref/README.md @@ -0,0 +1,17 @@ +# X3D 3D model reference images + +## ComputerKeyboard.x3d + +### Working (using IRR xml parser) +ComputerKeyboard as of 29 Sep 2020 git commit `6a4c338`, using IRR xml parsing, renders OK: + +<img alt="ComputerKeyboard.x3d (IRR xml)" src="screenshots/ComputerKeyboard_x3d_irr_xml.png" width=320 /> + +### Broken (using pugi xml parser) +ComputerKeyboard as of 1 Dec 2021 git commit `1614934`, using pugi xml parsing, renders with +missing meshes and obvious artifacts: + +<img alt="ComputerKeyboard.x3d (pugi xml)" src="screenshots/ComputerKeyboard_x3d_pugi_xml.png" width=320 /> + +## HelloWorld.x3d +<img alt="HelloWorld.x3d" src="screenshots/HelloWorld_x3d.png" width=180 /> diff --git a/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png Binary files differnew file mode 100644 index 000000000..787e8e7f6 --- /dev/null +++ b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png diff --git a/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png Binary files differnew file mode 100644 index 000000000..aaa45fb6d --- /dev/null +++ b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png diff --git a/test/models/X3D/ref/screenshots/HelloWorld_x3d.png b/test/models/X3D/ref/screenshots/HelloWorld_x3d.png Binary files differnew file mode 100644 index 000000000..581a2988d --- /dev/null +++ b/test/models/X3D/ref/screenshots/HelloWorld_x3d.png diff --git a/test/models/X3DB/HelloWorld.x3db b/test/models/X3DB/HelloWorld.x3db Binary files differnew file mode 100644 index 000000000..ba2f5c67c --- /dev/null +++ b/test/models/X3DB/HelloWorld.x3db diff --git a/test/models/X3DB/README.md b/test/models/X3DB/README.md new file mode 100644 index 000000000..9e83c8dd0 --- /dev/null +++ b/test/models/X3DB/README.md @@ -0,0 +1,6 @@ +# X3DB models + +X3DB models are compressed X3D models + +# HelloWorld.x3db +Downloaded from [HelloWorld.x3db](http://www.web3d.org/x3d/content/examples/HelloWorld.x3db) diff --git a/test/models/X3DB/earth-topo.png b/test/models/X3DB/earth-topo.png Binary files differnew file mode 100644 index 000000000..1749cb835 --- /dev/null +++ b/test/models/X3DB/earth-topo.png diff --git a/test/models/X3DV/HelloWorld.x3dv b/test/models/X3DV/HelloWorld.x3dv new file mode 100644 index 000000000..1da5c4fb5 --- /dev/null +++ b/test/models/X3DV/HelloWorld.x3dv @@ -0,0 +1,86 @@ +#X3D V3.3 utf8 +# X3D-to-ClassicVRML XSL translation autogenerated by X3dToVrml97.xslt +# https://www.web3d.org/x3d/content/X3dToVrml97.xslt +# Generated using XSLT processor: Saxonica + +PROFILE Immersive +# [X3D] version=3.3 +# [X3D] noNamespaceSchemaLocation=https://www.web3d.org/specifications/x3d-3.3.xsd +# [head] + +# Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON +META "title" "HelloWorld.x3d" +META "description" "Simple X3D model example: Hello World!" +META "created" "30 October 2000" +META "modified" "9 July 2023" +META "creator" "Don Brutzman" +META "Image" "HelloWorld.tall.png" +META "reference" "https://en.wikipedia.org/wiki/Hello_world" +META "reference" "https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program" +META "reference" "https://en.wikipedia.org/wiki/\"Hello,_World!\"_program" +META "reference" "https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world" +META "reference" "https://www.HelloWorldExample.net" +META "reference" "https://www.web3d.org" +META "reference" "https://www.web3d.org/realtime-3d/news/internationalization-x3d" +META "reference" "https://www.web3d.org/x3d/content/examples/HelloWorld.x3d" +META "reference" "https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d" +META "identifier" "https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d" +META "license" "https://www.web3d.org/x3d/content/examples/license.html" +META "generator" "X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit" +META "reference" "HelloWorld.wrl" +META "reference" "HelloWorld.x3dv" +META "reference" "HelloWorld.x3db" +META "reference" "HelloWorld.xhtml" +META "reference" "HelloWorld.json" + +# [Scene] ========== ========== ========== + +NavigationInfo { type [ "EXAMINE" "ANY" ] } ### Default X3D NavigationInfo + +# Example scene to illustrate X3D nodes and fields (XML elements and attributes) +WorldInfo { + info [ "Example scene to illustrate a simple X3D model" ] + title "Hello World!" +} +Group { + children [ + DEF ViewUpClose Viewpoint { + centerOfRotation 0 -1 0 + description "Hello world!" + position 0 -1 7 + } + Transform { + rotation 0 1 0 3 + children [ + Shape { + geometry Sphere { + } + appearance Appearance { + material DEF MaterialOffWhite Material { + diffuseColor 0.980392 0.976471 0.964706 + } + texture DEF ImageCloudlessEarth ImageTexture { + url [ "earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif" ] + } + } + } + ] + } + Transform { + translation 0 -2 0 + children [ + Shape { + geometry DEF TextMessage Text { + string [ "Hello" "world!" ] + fontStyle FontStyle { + justify [ "MIDDLE" "MIDDLE" ] + } + } + appearance Appearance { + material USE MaterialOffWhite + } + } + ] + } + ] +} diff --git a/test/models/X3DV/README.md b/test/models/X3DV/README.md new file mode 100644 index 000000000..83c951c6a --- /dev/null +++ b/test/models/X3DV/README.md @@ -0,0 +1,6 @@ +# X3DV models + +X3DV models are as simple WRL (VRML) models with the version number upgraded from `2` to `3` + +# HelloWorld.x3dv +Downloaded from [HelloWorld.x3dv](http://www.web3d.org/x3d/content/examples/HelloWorld.x3dv) diff --git a/test/models/X3DV/earth-topo.png b/test/models/X3DV/earth-topo.png Binary files differnew file mode 100644 index 000000000..1749cb835 --- /dev/null +++ b/test/models/X3DV/earth-topo.png diff --git a/test/models/X3DV/ref/README.md b/test/models/X3DV/ref/README.md new file mode 100644 index 000000000..25f3e93d9 --- /dev/null +++ b/test/models/X3DV/ref/README.md @@ -0,0 +1,4 @@ +# X3DV 3D model reference images + +## HelloWorld.x3dv +<img alt="HelloWorld.x3dv" src="screenshots/HelloWorld_x3dv.png" width=180 /> diff --git a/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png b/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png Binary files differnew file mode 100644 index 000000000..0860c7a85 --- /dev/null +++ b/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png diff --git a/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888 b/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888 Binary files differnew file mode 100644 index 000000000..36861a7e3 --- /dev/null +++ b/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888 diff --git a/test/models/glTF2/AnimatedMorphCube/LICENSE.md b/test/models/glTF2/AnimatedMorphCube/LICENSE.md new file mode 100644 index 000000000..f480b9838 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphCube/LICENSE.md @@ -0,0 +1,15 @@ +# LICENSE file for the model: Animated Morph Cube + +All files in this directory tree are licensed as indicated below. + +* All files directly associated with the model including all text, image and binary files: + + * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"] + +* This file and all other metadocumentation files including "metadata.json": + + * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +Full license text of these licenses are available at the links above + +#### Generated by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/AnimatedMorphCube/README.body.md b/test/models/glTF2/AnimatedMorphCube/README.body.md new file mode 100644 index 000000000..b6a21c084 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphCube/README.body.md @@ -0,0 +1,12 @@ +## Screenshot + + + +## Description + +The cube contains two morph targets in it: + + * **`thin`** : moves the vertices so that it becomes super-thin + * **`angle`** : moves the vertices so that it forms a ramp + +The animation loops, morphing between these two states.
\ No newline at end of file diff --git a/test/models/glTF2/AnimatedMorphCube/README.md b/test/models/glTF2/AnimatedMorphCube/README.md new file mode 100644 index 000000000..ca314920e --- /dev/null +++ b/test/models/glTF2/AnimatedMorphCube/README.md @@ -0,0 +1,36 @@ +# Animated Morph Cube + +## Tags + +[core](../../Models-core.md), [testing](../../Models-testing.md) + +## Summary + +Demonstrates a simple cube with two simple morph targets and an animation that transitions between them both. + +## Operations + +* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb) in SampleViewer +* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb) +* [Model Directory](./) + +## Screenshot + + + +## Description + +The cube contains two morph targets in it: + + * **`thin`** : moves the vertices so that it becomes super-thin + * **`angle`** : moves the vertices so that it forms a ramp + +The animation loops, morphing between these two states. + +## Legal + +© 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode) + + - Microsoft for Everything + +#### Assembled by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin Binary files differnew file mode 100644 index 000000000..7b14a1793 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin diff --git a/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf new file mode 100644 index 000000000..b1b720147 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf @@ -0,0 +1,282 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 24, + "type": "VEC4" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0100000035, + 0.0100000035, + 0.01 + ], + "min": [ + -0.0100000044, + -0.0100000054, + -0.01 + ] + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "thin" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0, + 0.01893253, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "name": "thin" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "thin" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "angle" + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0, + 0.0198908355, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "name": "angle" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "angle" + }, + { + "bufferView": 9, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 127, + "type": "SCALAR", + "max": [ + 4.19999743 + ], + "min": [ + 0.0 + ] + }, + { + "bufferView": 11, + "componentType": 5126, + "count": 254, + "type": "SCALAR" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "weights" + } + } + ], + "samplers": [ + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + } + ], + "name": "Square" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 288, + "byteLength": 384 + }, + { + "buffer": 0, + "byteOffset": 672, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 960, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1248, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1536, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1824, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2112, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2400, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2688, + "byteLength": 72 + }, + { + "buffer": 0, + "byteOffset": 2760, + "byteLength": 508 + }, + { + "buffer": 0, + "byteOffset": 3268, + "byteLength": 1016 + } + ], + "buffers": [ + { + "uri": "AnimatedMorphCube.bin", + "byteLength": 4284 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 0, + "TANGENT": 1, + "POSITION": 2 + }, + "indices": 9, + "material": 0, + "targets": [ + { + "NORMAL": 3, + "POSITION": 4, + "TANGENT": 5 + }, + { + "NORMAL": 6, + "POSITION": 7, + "TANGENT": 8 + } + ] + } + ], + "weights": [ + 0.0, + 0.0 + ], + "name": "Cube" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.6038274, + 0.6038274, + 0.6038274, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + }, + "name": "Material" + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0.0, + 0.7071067, + -0.7071068, + 0.0 + ], + "scale": [ + 100.0, + 100.0, + 100.0 + ], + "name": "AnimatedMorphCube" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +}
\ No newline at end of file diff --git a/test/models/glTF2/AnimatedMorphSphere/README.md b/test/models/glTF2/AnimatedMorphSphere/README.md new file mode 100644 index 000000000..d626d5cab --- /dev/null +++ b/test/models/glTF2/AnimatedMorphSphere/README.md @@ -0,0 +1,20 @@ +# Animated Morph Sphere + +## Screenshot + + + +## Description + +The sphere contains two morph targets in it: + + * **`blob`** : moves the vertices so that it becomes a somewhat amorphous fat, blob shape. + * **`ship`** : moves the vertices so that it looks a bit like a spaceship, the goal being + to just make it a much more complicated morph example than the [cube](../AnimatedMorphCube/README.md). + +The animation loops, morphing between these two states. + +## License Information + +[](http://creativecommons.org/publicdomain/zero/1.0/) +To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset. diff --git a/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin new file mode 100644 index 000000000..5bc8fc640 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin @@ -0,0 +1,185 @@ +īŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>nkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊęŧĸīŋŊīŋŊ>mīŋŊt?ęŧĸīŋŊīŋŊ>mīŋŊt?ęŧĸīŋŊīŋŊ>mīŋŊt?ęŧĸīŋŊīŋŊ>mīŋŊt?īŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊ5īŋŊīŋŊīŋŊ=bīŋŊ~īŋŊA+>īŋŊPīŋŊ=bīŋŊ~īŋŊīŋŊ5īŋŊ<īŋŊ=bīŋŊ~īŋŊf+>=fīŋŊ=bīŋŊ~īŋŊRīŋŊīŋŊīŋŊīŋŊ=fīŋŊ~īŋŊRīŋŊīŋŊīŋŊīŋŊ=fīŋŊ~īŋŊ[ëŊCīŋŊ=bīŋŊ~īŋŊīŋŊāąŊu)>=hīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊ3īŋŊ<bīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊ3īŋŊ<bīŋŊ~īŋŊZīŋŊČŊ)<dīŋŊ~īŋŊQīŋŊČŊ+)īŋŊbīŋŊ~īŋŊ
īŋŊīŋŊ4īŋŊfīŋŊ~īŋŊ
īŋŊīŋŊ4īŋŊfīŋŊ~īŋŊãąŊīŋŊ)>īŋŊbīŋŊ~īŋŊ\éŊvīŋŊīŋŊfīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊęŊbīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊęŊbīŋŊ~īŋŊE'>īŋŊxâąŊdīŋŊ~īŋŊīŋŊ-īŋŊ#īŋŊīŋŊdīŋŊ~īŋŊ!<īŋŊīŋŊČŊbīŋŊ~īŋŊ!<īŋŊīŋŊČŊbīŋŊ~īŋŊ#<<īŋŊČŊbīŋŊ~īŋŊīŋŊ-īŋŊ<'īŋŊīŋŊdīŋŊ~īŋŊT'>=īŋŊâąŊdīŋŊ~īŋŊT'>=īŋŊâąŊdīŋŊ~īŋŊīŋŊīŋŊ=īŋŊęŊbīŋŊ~īŋŊ~īŋŊ=īŋŊīŋŊīŋŊdīŋŊ~īŋŊ1īŋŊ=īŋŊ)>īŋŊdīŋŊ~īŋŊ1īŋŊ=īŋŊ)>īŋŊdīŋŊ~īŋŊīŋŊīŋŊ=īŋŊ3īŋŊaīŋŊ~īŋŊ_īŋŊīŋŊ=+)īŋŊbīŋŊ~īŋŊqīŋŊīŋŊ=M)<dīŋŊ~īŋŊqīŋŊīŋŊ=M)<dīŋŊ~īŋŊCīŋŊ=4īŋŊ<aīŋŊ~īŋŊīŋŊ=īŋŊ)>=fīŋŊ~īŋŊwīŋŊ=rīŋŊ=bīŋŊ~īŋŊwīŋŊ=rīŋŊ=bīŋŊ~īŋŊīŋŊīŋŊ=īŋŊīŋŊ=fīŋŊ~īŋŊīŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?īŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?īŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?Y1īŋŊīŋŊīŋŊ=dīŋŊ~?{+>īŋŊRīŋŊ=bīŋŊ~?s1īŋŊ<īŋŊīŋŊ=dīŋŊ~?īŋŊ+>=YīŋŊ=bīŋŊ~?īŋŊīŋŊīŋŊīŋŊīŋŊ=dīŋŊ~?īŋŊīŋŊīŋŊīŋŊīŋŊ=dīŋŊ~?īŋŊęŊ;īŋŊ=bīŋŊ~?īŋŊâąŊl)>=bīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊ<aīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊ<aīŋŊ~?qīŋŊČŊ+)<dīŋŊ~?{īŋŊČŊ))īŋŊaīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊdīŋŊ~?īŋŊâąŊ{)>īŋŊbīŋŊ~?īŋŊęŊKīŋŊīŋŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊęŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊęŊdīŋŊ~?īŋŊ+>īŋŊVâąŊbīŋŊ~?f1īŋŊīŋŊīŋŊīŋŊdīŋŊ~?īŋŊ&īŋŊīŋŊīŋŊČŊdīŋŊ~?īŋŊ&īŋŊīŋŊīŋŊČŊdīŋŊ~?='<īŋŊīŋŊČŊdīŋŊ~?īŋŊ1īŋŊ<īŋŊīŋŊīŋŊdīŋŊ~?īŋŊ+>=VâąŊbīŋŊ~?īŋŊ+>=VâąŊbīŋŊ~?īŋŊīŋŊ=īŋŊęŊdīŋŊ~?īŋŊīŋŊ=KīŋŊīŋŊbīŋŊ~?īŋŊīŋŊ=t)>īŋŊbīŋŊ~?īŋŊīŋŊ=t)>īŋŊbīŋŊ~?īŋŊīŋŊ=īŋŊ3īŋŊdīŋŊ~?īŋŊīŋŊīŋŊ=7)īŋŊaīŋŊ~?īŋŊīŋŊīŋŊ=8)<dīŋŊ~?īŋŊīŋŊīŋŊ=8)<dīŋŊ~?īŋŊīŋŊ=īŋŊ3īŋŊ<aīŋŊ~?>īŋŊ=īŋŊ)>=dīŋŊ~?īŋŊīŋŊ=MīŋŊ=bīŋŊ~?īŋŊīŋŊ=MīŋŊ=bīŋŊ~?īŋŊīŋŊ=īŋŊīŋŊ=dīŋŊ~?īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=ęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊe*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>īŋŊęžīŋŊīŋŊs?FīŋŊīŋŊ=īŋŊęžīŋŊīŋŊs?FīŋŊīŋŊ=īŋŊęžīŋŊīŋŊs?FīŋŊīŋŊ=īŋŊęžīŋŊīŋŊs?FīŋŊīŋŊ=īŋŊVīŋŊīŋŊÛ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊÛ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊÛ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊÛ>mīŋŊtīŋŊīŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>\īŋŊīŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊīŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊīŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊīŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊm7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>E=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊo9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?s9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊ==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?j7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊ[īŋŊīŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊīŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊīŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊīŋŊīŋŊīŋŊīŋŊ>dīŋŊa?īŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊWīŋŊīŋŊÛ>kīŋŊt?īŋŊWīŋŊīŋŊÛ>kīŋŊt?īŋŊWīŋŊīŋŊÛ>kīŋŊt?īŋŊWīŋŊīŋŊÛ>kīŋŊt?īŋŊęžīŋŊīŋŊs?FīŋŊĮŊīŋŊęžīŋŊīŋŊs?FīŋŊĮŊīŋŊęžīŋŊīŋŊs?FīŋŊĮŊīŋŊęžīŋŊīŋŊs?FīŋŊĮŊ.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?tÕžnSG?sīŋŊtÕžnSG?sīŋŊtÕžnSG?sīŋŊtÕžnSG?sīŋŊxgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?ZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊrīŋŊīŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊīŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊīŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊīŋŊīŋŊīŋŊ>mīŋŊt?@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=līŋŊīŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊīŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊīŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊīŋŊīŋŊīŋŊ>mīŋŊtīŋŊ\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>IgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊ~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊ{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>zīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊīŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊīŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊgīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?zyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊi=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?OīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊNīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=i=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊ]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?Cr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊvīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?hīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=īŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊBr=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>kEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊīŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊqSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>īŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?nSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊīŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?F#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊaīŋŊ>mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ>mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ>mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ>mīŋŊt?īŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊīŋŊīŋŊiīŋŊ>mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ>mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ>mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ>mīŋŊtīŋŊG#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊÚīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊÚīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊÚīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊÚīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=ÛīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊÛīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊÛīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊÛīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊīŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊīŋŊīŋŊNīŋŊ>fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ>fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ>fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ>fīŋŊaīŋŊīŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊīŋŊZīŋŊ>fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ>fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ>fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ>fīŋŊa?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊ
īŋŊ==aīŋŊa?īŋŊ
īŋŊ==aīŋŊa?īŋŊ
īŋŊ==aīŋŊa?īŋŊ
īŋŊ==aīŋŊa?ZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>qīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊīŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>nīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊsīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?ZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊīŋŊgīŋŊīŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊīŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊīŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊīŋŊbīŋŊa?īŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊÛīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ÛīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ÛīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ÛīŋŊīŋŊVīŋŊīŋŊkīŋŊt?īŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊęžīŋŊīŋŊīŋŊ=ÛīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊÛīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊÛīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊÛīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊīŋŊīŋŊ\īŋŊīŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊīŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊīŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊīŋŊfīŋŊaīŋŊīŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=,īŋŊīŋŊīŋŊnīŋŊīŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊīŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊīŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊīŋŊjīŋŊtīŋŊB#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>īŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊmSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ> īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?kSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊīŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?B#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊeīŋŊīŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊīŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊīŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊīŋŊqīŋŊt?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊkEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?Hr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊ +īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ +īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ +īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ +īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>īŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊ +īŋŊ#īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊ:īŋŊ īŋŊ +īŋŊC:n>īŋŊ:īŋŊ īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ +īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊīŋŊīŋŊīŋŊ: +īŋŊĮšīŋŊ īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊBĐ´:)Đ´:īŋŊ īŋŊuīŋŊīŋŊ0NÍą +īŋŊ#īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊ +īŋŊ#<īŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ <īŋŊv&īŋŊPīŋŊīŋŊ:īŋŊ <īŋŊCīŋŊi>īŋŊ:īŋŊ <rīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <īŋŊīŋŊīŋŊ9~īŋŊīŋŊ:īŋŊ <īŋŊīŋŊC:]>īŋŊ:īŋŊ < +īŋŊ#<@Đ´īŋŊ&Đ´:īŋŊ <9īŋŊÔēWīŋŊ:īŋŊ <īŋŊ>īŋŊÕĩC:īŋŊ < +īŋŊ#<īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <wīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ < +īŋŊ#<īŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <=Đ´īŋŊYĐ´īŋŊīŋŊ < +īŋŊ#<pīŋŊīŋŊRīŋŊÔēīŋŊ < īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <īŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ < +īŋŊ#< +U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊ>īŋŊīŋŊ < +īŋŊ#<līŋŊ:LīŋŊÔēīŋŊ <8Đ´:TĐ´īŋŊīŋŊ <0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ < +īŋŊ#<x>īŋŊ:7īŋŊCīŋŊīŋŊ <īŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <līŋŊīŋŊ:RīŋŊXīŋŊīŋŊ < +īŋŊ#<īŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <x>īŋŊ:ĘĩC:īŋŊ </īŋŊīŋŊ:OīŋŊ:īŋŊ < +īŋŊ#<7Đ´:Đ´:īŋŊ <jīŋŊ:īŋŊīŋŊ:īŋŊ <īŋŊīŋŊ0īŋŊīŋŊ <iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:xīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊ@;īŋŊīŋŊ#<īŋŊOīŋŊīŋŊWīŋŊīŋŊīŋŊz;P^īŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊίaīŋŊīŋŊ:īŋŊ īŋŊ[īŋŊ.īŋŊK^<īŋŊīŋŊz;īŋŊ>ėēŊu<īŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊ0īŋŊīŋŊ <iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊīŋŊzīŋŊP^<īŋŊOīŋŊxīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊ>ėēŊu<īŋŊīŋŊz;oīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊz;īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ;]:īŋŊīŋŊUīŋŊ +1īŋŊ;]:īŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊ;īŋŊÔēCīŋŊ<īŋŊīŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;oīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊz;īŋŊ>ėēŊu<īŋŊīŋŊz;AĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊįģĨUīŋŊ +1īŋŊ;]:īŋŊuīŋŊīŋŊīŋŊīŋŊ;]:īŋŊAĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;;īŋŊÔēCīŋŊ<īŋŊīŋŊ;;īŋŊÔēCīŋŊ<īŋŊīŋŊīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊAĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊtīŋŊīŋŊīŋŊīŋŊ;]:<īŋŊUīŋŊ 1īŋŊ;]:<īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;AĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊ>ėēŊu<īŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊzīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊīŋŊ;īŋŊÔēCīŋŊ<īŋŊīŋŊīŋŊ
īŋŊCīŋŊīŋŊīŋŊu;R^<YīŋŊdīŋŊg;R^<īŋŊUīŋŊ 1īŋŊ;]:<tīŋŊīŋŊīŋŊīŋŊ;]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊnīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊzīŋŊīŋŊ>ėēŊu<īŋŊīŋŊzīŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ <īŋŊCīŋŊi>īŋŊ:īŋŊ <YīŋŊdīŋŊg;R^<
īŋŊCīŋŊīŋŊīŋŊu;R^<xīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊīŋŊīŋŊzīŋŊP^<īŋŊOīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<uīŋŊīŋŊīŋŊīŋŊUīŋŊ 1īŋŊ;]:<JHJīŋŊN^īŋŊ;]:<sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;nīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊzīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊīŋŊYīŋŊdīŋŊg;R^<īŋŊUīŋŊUīŋŊP;R^<JHJīŋŊN^īŋŊ;]:<īŋŊUīŋŊ 1īŋŊ;]:<īŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊzīŋŊīŋŊCīŋŊi>īŋŊ:īŋŊ <rīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <īŋŊUīŋŊUīŋŊP;R^<YīŋŊdīŋŊg;R^<īŋŊīŋŊzīŋŊP^<īŋŊOīŋŊīŋŊīŋŊīŋŊ[:<īŋŊOīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ: īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊīŋŊ[:<īŋŊOīŋŊīŋŊīŋŊzīŋŊP^<īŋŊOīŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊUīŋŊ\īŋŊP;P^īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊoīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊz;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz; īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊUīŋŊ +1īŋŊ;]:īŋŊKHJīŋŊO^īŋŊ;]:īŋŊīŋŊUīŋŊ\īŋŊP;P^īŋŊ^īŋŊkīŋŊg;P^īŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;oīŋŊgīŋŊīŋŊīŋŊ<īŋŊīŋŊz;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊKHJīŋŊO^īŋŊ;]:īŋŊīŋŊUīŋŊ +1īŋŊ;]:īŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊīŋŊīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;<Öģ7īŋŊ;īŋŊīŋŊz;īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ: īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:KHJīŋŊO^īŋŊ;]:īŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊīŋŊUīŋŊ\īŋŊP;P^īŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊ;<Öģ7īŋŊ;īŋŊīŋŊz;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊKHJīŋŊO^īŋŊ;]:īŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊJHJīŋŊN^īŋŊ;]:<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊīŋŊUīŋŊUīŋŊP;R^<īŋŊV1īŋŊīŋŊV1;R^<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<JHJīŋŊN^īŋŊ;]:< īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊrīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <@Đ´īŋŊ&Đ´:īŋŊ <īŋŊV1īŋŊīŋŊV1;R^<īŋŊUīŋŊUīŋŊP;R^<īŋŊīŋŊīŋŊ[:<īŋŊOīŋŊoīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:oīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊīŋŊīŋŊ[:<īŋŊOīŋŊīŋŊUīŋŊ\īŋŊP;P^īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊV1īŋŊīŋŊV1;R^<dīŋŊPīŋŊīŋŊU;R^<T^īŋŊīŋŊ;HJ;]:<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<īŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊ@Đ´īŋŊ&Đ´:īŋŊ <9īŋŊÔēWīŋŊ:īŋŊ <dīŋŊPīŋŊīŋŊU;R^<īŋŊV1īŋŊīŋŊV1;R^<oīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊ_:īŋŊīŋŊīŋŊ;īŋŊOīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:_:īŋŊīŋŊīŋŊ;īŋŊOīŋŊoīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊiīŋŊPīŋŊīŋŊU;P^īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊ<Öģ7īŋŊ;īŋŊīŋŊz;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:tīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊV^īŋŊīŋŊ=HJ;]:īŋŊiīŋŊPīŋŊīŋŊU;P^īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊ;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;<Öģ7īŋŊ;īŋŊīŋŊz;×ŖīŋŊ×Ŗ;jīŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊV^īŋŊīŋŊ=HJ;]:īŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊsīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<T^īŋŊīŋŊ;HJ;]:<ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;<Öģ5īŋŊ;īŋŊīŋŊzīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊīŋŊīŋŊV^īŋŊīŋŊ=HJ;]:īŋŊ1īŋŊīŋŊīŋŊU;]:īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊiīŋŊPīŋŊīŋŊU;P^īŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊ;īŋŊīŋŊīŋŊdīŋŊg;īŋŊīŋŊz;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ1īŋŊīŋŊīŋŊU;]:īŋŊV^īŋŊīŋŊ=HJ;]:īŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;=ÖģīŋŊV1;jīŋŊīŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊT^īŋŊīŋŊ;HJ;]:<1īŋŊīŋŊīŋŊU;]:<=ÖģīŋŊV1;jīŋŊīŋŊ;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;oīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊaīŋŊg;īŋŊīŋŊzīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊīŋŊīŋŊdīŋŊPīŋŊīŋŊU;R^<pīŋŊgīŋŊ@īŋŊ:R^<1īŋŊīŋŊīŋŊU;]:<T^īŋŊīŋŊ;HJ;]:<DīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊaīŋŊg;īŋŊīŋŊzīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊ9īŋŊÔēWīŋŊ:īŋŊ <īŋŊ>īŋŊÕĩC:īŋŊ <pīŋŊgīŋŊ@īŋŊ:R^<dīŋŊPīŋŊīŋŊU;R^<_:īŋŊīŋŊīŋŊ;īŋŊOīŋŊS^īŋŊīŋŊīŋŊz;īŋŊOīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:S^īŋŊīŋŊīŋŊz;īŋŊOīŋŊ_:īŋŊīŋŊīŋŊ;īŋŊOīŋŊiīŋŊPīŋŊīŋŊU;P^īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊoīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;īŋŊīŋŊīŋŊdīŋŊg;īŋŊīŋŊz;īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊaīŋŊg;īŋŊīŋŊzīŋŊīŋŊ>īŋŊÕĩC:īŋŊ <īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <īŋŊīŋŊuīŋŊ×ĩC:R^<pīŋŊgīŋŊ@īŋŊ:R^<S^īŋŊīŋŊīŋŊz;īŋŊOīŋŊ īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ: īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊS^īŋŊīŋŊīŋŊz;īŋŊOīŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊīŋŊuīŋŊŲĩC:P^īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊīŋŊīŋŊīŋŊdīŋŊg;īŋŊīŋŊz;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:1īŋŊīŋŊīŋŊU;]:īŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊuīŋŊŲĩC:P^īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊīŋŊdīŋŊg;īŋŊīŋŊz;=ÖģīŋŊV1;jīŋŊįģ¯@īŋŊ%Đ´:jīŋŊīŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊ1īŋŊīŋŊīŋŊU;]:īŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ1īŋŊīŋŊīŋŊU;]:<!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;=ÖģīŋŊV1;jīŋŊīŋŊ;īŋŊīŋŊīŋŊaīŋŊg;īŋŊīŋŊzīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊīŋŊīŋŊpīŋŊgīŋŊ@īŋŊ:R^<īŋŊīŋŊuīŋŊ×ĩC:R^<!īŋŊīŋŊīŋŊTīŋŊ:]:<1īŋŊīŋŊīŋŊU;]:<EīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;_:īŋŊīŋŊeīŋŊīŋŊīŋŊ;R^īŋŊ +īŋŊīŋŊīŋŊīŋŊz;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģĄīŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;_:īŋŊīŋŊeīŋŊīŋŊīŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊ_:īŋŊīŋŊeīŋŊīŋŊīŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģ¯@īŋŊ%Đ´:jīŋŊīŋŊ!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊīŋŊīŋŊ×ŗjīŋŊ]:<nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;īŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊ_:īŋŊīŋŊeīŋŊīŋŊīŋŊīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊ×ĩC:R^<īŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊīŋŊīŋŊ×ŗjīŋŊ]:<!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <wīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊīŋŊuīŋŊ×ĩC:R^< īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊ
īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:
īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊ īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊīŋŊuīŋŊŲĩC:P^īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊīŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;R^īŋŊ +īŋŊīŋŊīŋŊīŋŊz;īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊīŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊuīŋŊŲĩC:P^īŋŊwīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ <īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^<īŋŊīŋŊzīŋŊ=QīŋŊR^<
īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊ īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ: īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊ
īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊR^īŋŊ +īŋŊīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊ>ėēīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊ_:īŋŊīŋŊeīŋŊīŋŊīŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊīŋŊ;īŋŊuīŋŊīŋŊ>ėēīŋŊz;R^īŋŊ +īŋŊīŋŊīŋŊīŋŊz;nīŋŊįģŽW[īŋŊjīŋŊįģŽ@īŋŊYĐ´īŋŊjīŋŊīŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊīŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊnīŋŊįģŽW[īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊīŋŊ;_:īŋŊīŋŊeīŋŊīŋŊīŋŊ;_:īŋŊīŋŊeīŋŊīŋŊīŋŊīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊīŋŊīŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģīŋŊīŋŊ×ŗjīŋŊ]:< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;R^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊīŋŊīŋŊ_:īŋŊīŋŊeīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ×ŗjīŋŊ]:<īŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ1īŋŊīŋŊīŋŊUīŋŊ]:īŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊīŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊīŋŊīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊįģŽ@īŋŊYĐ´īŋŊjīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<
1īŋŊīŋŊīŋŊUīŋŊ]:<<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;īŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊīŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^<nīŋŊgīŋŊrīŋŊR^<
1īŋŊīŋŊīŋŊUīŋŊ]:< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ <īŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <nīŋŊgīŋŊrīŋŊR^<īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^< īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊR^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:R^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊ īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊuīŋŊīŋŊ>ėēīŋŊz;īŋŊīŋŊīŋŊuīŋŊgīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊ1īŋŊīŋŊīŋŊUīŋŊ]:īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊDīŋŊīŋŊSīŋŊÔēīŋŊīŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊuīŋŊgīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊ>ėēīŋŊz;R^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊ^:īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:^:īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊR^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊtīŋŊgīŋŊwīŋŊP^īŋŊfīŋŊPīŋŊīŋŊUīŋŊP^īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊuīŋŊgīŋŊīŋŊīŋŊz;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:1īŋŊīŋŊīŋŊUīŋŊ]:īŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊfīŋŊPīŋŊīŋŊUīŋŊP^īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊ;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊuīŋŊgīŋŊīŋŊīŋŊz;<ÖģīŋŊV1īŋŊjīŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊ1īŋŊīŋŊīŋŊUīŋŊ]:īŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ
1īŋŊīŋŊīŋŊUīŋŊ]:<R^īŋŊīŋŊTHJīŋŊ]:<ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;īŋŊīŋŊīŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊīŋŊīŋŊnīŋŊgīŋŊrīŋŊR^<`īŋŊPīŋŊīŋŊUīŋŊR^<R^īŋŊīŋŊTHJīŋŊ]:<
1īŋŊīŋŊīŋŊUīŋŊ]:<īŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <`īŋŊPīŋŊīŋŊUīŋŊR^<nīŋŊgīŋŊrīŋŊR^<ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊīŋŊ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊR^īŋŊīŋŊTHJīŋŊ]:<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊPīŋŊīŋŊUīŋŊR^<īŋŊV1īŋŊīŋŊV1īŋŊR^<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<R^īŋŊīŋŊTHJīŋŊ]:<BīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <=Đ´īŋŊYĐ´īŋŊīŋŊ <īŋŊV1īŋŊīŋŊV1īŋŊR^<`īŋŊPīŋŊīŋŊUīŋŊR^<^:īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊkīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:kīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊ^:īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊfīŋŊPīŋŊīŋŊUīŋŊP^īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;<Öģ@ÖģīŋŊīŋŊz;īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:T^īŋŊīŋŊUHJīŋŊ]:īŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊfīŋŊPīŋŊīŋŊUīŋŊP^īŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊīŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊ;<Öģ@ÖģīŋŊīŋŊz;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊīŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊb:īŋŊīŋŊOīŋŊkīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊīŋŊUīŋŊpīŋŊPīŋŊP^īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊ<Öģ@ÖģīŋŊīŋŊz;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:rīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊīŋŊUīŋŊpīŋŊPīŋŊP^īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģīŋŊ;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;<Öģ@ÖģīŋŊīŋŊz;×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģīŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊīŋŊP^īŋŊīŋŊīŋŊīŋŊâģīŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<DHJīŋŊX^īŋŊīŋŊ]:<pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;<Öģ@ÖģīŋŊīŋŊzīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊP^īŋŊīŋŊīŋŊīŋŊâģīŋŊīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊV1īŋŊīŋŊV1īŋŊR^<īŋŊUīŋŊkīŋŊPīŋŊR^<DHJīŋŊX^īŋŊīŋŊ]:<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<īŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊ=Đ´īŋŊYĐ´īŋŊīŋŊ <pīŋŊīŋŊRīŋŊÔēīŋŊ <īŋŊUīŋŊkīŋŊPīŋŊR^<īŋŊV1īŋŊīŋŊV1īŋŊR^<kīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊDHJīŋŊX^īŋŊīŋŊ]:<īŋŊUīŋŊ1īŋŊīŋŊ]:<īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊP^īŋŊīŋŊīŋŊīŋŊâģīŋŊīŋŊīŋŊUīŋŊkīŋŊPīŋŊR^<TīŋŊxīŋŊgīŋŊR^<īŋŊUīŋŊ1īŋŊīŋŊ]:<DHJīŋŊX^īŋŊīŋŊ]:<īŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊnīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊpīŋŊīŋŊRīŋŊÔēīŋŊ < īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <TīŋŊxīŋŊgīŋŊR^<īŋŊUīŋŊkīŋŊPīŋŊR^<īŋŊīŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊUīŋŊpīŋŊPīŋŊP^īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;nīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:GHJīŋŊY^īŋŊīŋŊ]:īŋŊīŋŊUīŋŊ1īŋŊīŋŊ]:īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊUīŋŊpīŋŊPīŋŊP^īŋŊP^īŋŊīŋŊīŋŊīŋŊâģīŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊ;nīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊz;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊįģĸUīŋŊ1īŋŊīŋŊ]:īŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģīŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģīŋŊīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊCīŋŊīŋŊuīŋŊP^īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊnīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊUīŋŊ1īŋŊīŋŊ]:īŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊīŋŊCīŋŊīŋŊuīŋŊP^īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊ;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;nīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊīŋŊUīŋŊ1īŋŊīŋŊ]:īŋŊīŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊįģUīŋŊ1īŋŊīŋŊ]:<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;nīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊTīŋŊxīŋŊgīŋŊR^<īŋŊCīŋŊīŋŊuīŋŊR^<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊUīŋŊ1īŋŊīŋŊ]:<īŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <īŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊCīŋŊīŋŊuīŋŊR^<TīŋŊxīŋŊgīŋŊR^<īŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊlīŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:līŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊ>īŋŊj0^:īŋŊīŋŊīŋŊīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊCīŋŊīŋŊuīŋŊR^< +U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ]:<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ < +U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ < +U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊCīŋŊīŋŊuīŋŊR^<līŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊlīŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊCīŋŊīŋŊuīŋŊP^īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊ +īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:sīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊéĢīŋŊīŋŊīŋŊīŋŊ]:īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊīŋŊCīŋŊīŋŊuīŋŊP^īŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊ;>īŋŊj0^:īŋŊīŋŊīŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊiīŋŊ/pīŋŊīŋŊjīŋŊīŋŊéĢīŋŊīŋŊīŋŊīŋŊ]:īŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;iīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;>īŋŊj0^:īŋŊīŋŊīŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊīŋŊīŋŊ>īŋŊj0^:īŋŊīŋŊīŋŊīŋŊiīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊmīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ]:<iīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:éĢīŋŊīŋŊīŋŊīŋŊ]:īŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊ>īŋŊj0^:īŋŊīŋŊīŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;iīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊéĢīŋŊīŋŊīŋŊīŋŊ]:īŋŊiīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;>īŋŊj0^:īŋŊīŋŊīŋŊ;>īŋŊj0^:īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊiīŋŊ/pīŋŊīŋŊjīŋŊįģīŋŊīŋŊ.īŋŊīŋŊīŋŊ]:<nīŋŊ:"īŋŊīŋŊīŋŊ]:<>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;iīŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊīŋŊ>īŋŊj0^:īŋŊīŋŊīŋŊīŋŊ +U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊC:īŋŊuīŋŊR^<nīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ]:<>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊ +U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊuīŋŊR^< +U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊ}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ +īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊC:īŋŊuīŋŊR^<RīŋŊ:tīŋŊgīŋŊR^<īŋŊU;1īŋŊīŋŊ]:<nīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊgīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊ>īŋŊīŋŊ <RīŋŊ:tīŋŊgīŋŊR^<īŋŊC:īŋŊuīŋŊR^<}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊz;T^īŋŊīŋŊOīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊz;T^īŋŊīŋŊOīŋŊ}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊC: īŋŊuīŋŊP^īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;gīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:nīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊīŋŊU;1īŋŊīŋŊ]:īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊ;gīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊz;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊīŋŊV1;>ÖģjīŋŊįģ U;1īŋŊīŋŊ]:īŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;īŋŊV1;>ÖģjīŋŊīŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊV1;>ÖģjīŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊnīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊU;1īŋŊīŋŊ]:<īŋŊV1;>ÖģjīŋŊīŋŊ;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊgīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊU;1īŋŊīŋŊ]:īŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊīŋŊU;kīŋŊPīŋŊP^īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊ;O^īŋŊ;īŋŊâģīŋŊ; +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;gīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊV1;>ÖģjīŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊīŋŊU;1īŋŊīŋŊ]:īŋŊīŋŊV1;>ÖģjīŋŊīŋŊ;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;O^īŋŊ;īŋŊâģīŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊO^īŋŊ;īŋŊâģīŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊīŋŊV1;>ÖģjīŋŊįģU;1īŋŊīŋŊ]:<BHJ;V^īŋŊīŋŊ]:<oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;īŋŊV1;>ÖģjīŋŊīŋŊ;gīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊO^īŋŊ;īŋŊâģīŋŊīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊRīŋŊ:tīŋŊgīŋŊR^<īŋŊU;fīŋŊPīŋŊR^<BHJ;V^īŋŊīŋŊ]:<īŋŊU;1īŋŊīŋŊ]:<īŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊ +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊgīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊC:īŋŊ>īŋŊīŋŊ <līŋŊ:LīŋŊÔēīŋŊ <īŋŊU;fīŋŊPīŋŊR^<RīŋŊ:tīŋŊgīŋŊR^<īŋŊīŋŊz;T^īŋŊīŋŊOīŋŊīŋŊīŋŊ;_:īŋŊīŋŊOīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;_:īŋŊīŋŊOīŋŊīŋŊīŋŊz;T^īŋŊīŋŊOīŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊU;kīŋŊPīŋŊP^īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊgīŋŊg;īŋŊīŋŊīŋŊīŋŊīŋŊz; +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊ +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊlīŋŊ:LīŋŊÔēīŋŊ <8Đ´:TĐ´īŋŊīŋŊ <īŋŊV1;īŋŊV1īŋŊR^<īŋŊU;fīŋŊPīŋŊR^<īŋŊīŋŊ;_:īŋŊīŋŊOīŋŊlīŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:līŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊ;_:īŋŊīŋŊOīŋŊīŋŊU;kīŋŊPīŋŊP^īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊ +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;7īŋŊ;>ÖģīŋŊīŋŊz;īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:EHJ;Y^īŋŊīŋŊ]:īŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊīŋŊU;kīŋŊPīŋŊP^īŋŊO^īŋŊ;īŋŊâģīŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊ;7īŋŊ;>ÖģīŋŊīŋŊz; +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ +×Ŗ;×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ; +×Ŗ;×ŖīŋŊjīŋŊīŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊ;O^īŋŊ;īŋŊâģīŋŊ;O^īŋŊ;īŋŊâģīŋŊīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊīŋŊ +×Ŗ;×ŖīŋŊjīŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊBHJ;V^īŋŊīŋŊ]:<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:< +×Ŗ;×ŖīŋŊjīŋŊīŋŊ;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ; +1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊīŋŊO^īŋŊ;īŋŊâģīŋŊīŋŊīŋŊU;fīŋŊPīŋŊR^<īŋŊV1;īŋŊV1īŋŊR^<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<BHJ;V^īŋŊīŋŊ]:<ɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;7īŋŊ;>ÖģīŋŊīŋŊz; +×Ŗ;×ŖīŋŊjīŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊ +×Ŗ;×ŖīŋŊjīŋŊīŋŊ;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ +×Ŗ;×ŖīŋŊjīŋŊīŋŊnīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<O^īŋŊ;MHJīŋŊ]:<˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ; +×Ŗ;×ŖīŋŊjīŋŊīŋŊ;7īŋŊ;>ÖģīŋŊīŋŊzīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊV1;īŋŊV1īŋŊR^<YīŋŊP;īŋŊUīŋŊR^<O^īŋŊ;MHJīŋŊ]:<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊ8Đ´:TĐ´īŋŊīŋŊ <0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ <YīŋŊP;īŋŊUīŋŊR^<īŋŊV1;īŋŊV1īŋŊR^<līŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊ]:<īŋŊīŋŊīŋŊīŋŊOīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:]:<īŋŊīŋŊīŋŊīŋŊOīŋŊlīŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊ]īŋŊP;īŋŊUīŋŊP^īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊ7īŋŊ;>ÖģīŋŊīŋŊz;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:pīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊ]īŋŊP;īŋŊUīŋŊP^īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊ0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ <x>īŋŊ:7īŋŊCīŋŊīŋŊ <eīŋŊg;eīŋŊR^<YīŋŊP;īŋŊUīŋŊR^<]:<īŋŊīŋŊīŋŊīŋŊOīŋŊP^<īŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:P^<īŋŊīŋŊzīŋŊīŋŊOīŋŊ]:<īŋŊīŋŊīŋŊīŋŊOīŋŊ]īŋŊP;īŋŊUīŋŊP^īŋŊiīŋŊg;jīŋŊP^īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊz;īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:Q^īŋŊ;SHJīŋŊ]:īŋŊ1īŋŊ;īŋŊUīŋŊ]:īŋŊiīŋŊg;jīŋŊP^īŋŊ]īŋŊP;īŋŊUīŋŊP^īŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊ;īŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊz;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ1īŋŊ;īŋŊUīŋŊ]:īŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊO^īŋŊ;MHJīŋŊ]:< 1īŋŊ;īŋŊUīŋŊ]:<8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊzīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊīŋŊīŋŊYīŋŊP;īŋŊUīŋŊR^<eīŋŊg;eīŋŊR^< 1īŋŊ;īŋŊUīŋŊ]:<O^īŋŊ;MHJīŋŊ]:<@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊzīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;?īŋŊ<;īŋŊÔēīŋŊīŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊīŋŊ?īŋŊ<;īŋŊÔēīŋŊīŋŊīŋŊīŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ 1īŋŊ;īŋŊUīŋŊ]:<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;īŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊ?īŋŊ<;īŋŊÔēīŋŊīŋŊīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊīŋŊeīŋŊg;eīŋŊR^<īŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:< 1īŋŊ;īŋŊUīŋŊ]:<īŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊzīŋŊx>īŋŊ:7īŋŊCīŋŊīŋŊ <īŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <īŋŊīŋŊu;-īŋŊCīŋŊR^<eīŋŊg;eīŋŊR^<P^<īŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊP^<īŋŊīŋŊzīŋŊīŋŊOīŋŊiīŋŊg;jīŋŊP^īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊīŋŊīŋŊīŋŊ: +īŋŊĮšīŋŊ īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊz;īŋŊu<īŋŊ>ėēīŋŊz;īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:1īŋŊ;īŋŊUīŋŊ]:īŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊiīŋŊg;jīŋŊP^īŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊīŋŊ;?īŋŊ<;īŋŊÔēīŋŊīŋŊ;īŋŊu<īŋŊ>ėēīŋŊz;īŋŊīŋŊ<xīŋŊgīŋŊīŋŊīŋŊz;8īŋŊ;īŋŊV1īŋŊjīŋŊįģĒ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊ1īŋŊ;īŋŊUīŋŊ]:īŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ: +īŋŊĮšīŋŊ īŋŊīŋŊu<īŋŊ>ėēīŋŊz;P^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊīŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊ?īŋŊ<;īŋŊÔēīŋŊīŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;P^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊu<īŋŊ>ėēīŋŊz;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģīŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;?īŋŊ<;īŋŊÔēīŋŊīŋŊ;?īŋŊ<;īŋŊÔēīŋŊīŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģĒ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊīŋŊ;īŋŊa2īŋŊ]:<iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;īŋŊu<īŋŊ>ėē īŋŊzīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ?īŋŊ<;īŋŊÔēīŋŊīŋŊīŋŊīŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊīŋŊz;3C-īŋŊR^<īŋŊīŋŊ;īŋŊa2īŋŊ]:<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <līŋŊīŋŊ:RīŋŊXīŋŊīŋŊ <īŋŊīŋŊz;3C-īŋŊR^<īŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģīŋŊ;īŋŊa2īŋŊ]:<īŋŊīŋŊ;VīŋŊ:]:<īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;P^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊz;3C-īŋŊR^<īŋŊīŋŊu;ÔĩC:R^<īŋŊīŋŊ;VīŋŊ:]:<īŋŊīŋŊ;īŋŊa2īŋŊ]:<īŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊlīŋŊīŋŊ:RīŋŊXīŋŊīŋŊ <īŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <īŋŊīŋŊu;ÔĩC:R^<īŋŊīŋŊz;3C-īŋŊR^<īŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊP^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊ;īŋŊu<b>īŋŊ:īŋŊīŋŊz;P^<īŋŊW[īŋŊīŋŊīŋŊz;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģŠ@īŋŊ;+Đ´:jīŋŊīŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊīŋŊ;īŋŊAīŋŊ]:īŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:M^<īŋŊīŋŊz;īŋŊOīŋŊīŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊgīŋŊg;9īŋŊ:P^īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊ<\īŋŊg;īŋŊīŋŊz;īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊīŋŊ;VīŋŊ:]:īŋŊ 1īŋŊ;īŋŊU;]:īŋŊgīŋŊg;9īŋŊ:P^īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊ;īŋŊīŋŊ<\īŋŊg;īŋŊīŋŊz;īŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊ 1īŋŊ;īŋŊU;]:īŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;5īŋŊ;īŋŊV1;jīŋŊīŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊįģŠ@īŋŊ;+Đ´:jīŋŊīŋŊīŋŊīŋŊ;VīŋŊ:]:<1īŋŊ;īŋŊU;]:<5īŋŊ;īŋŊV1;jīŋŊīŋŊ;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;īŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊ<\īŋŊg;īŋŊīŋŊzīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊu;ÔĩC:R^<bīŋŊg;8īŋŊ:R^<1īŋŊ;īŋŊU;]:<īŋŊīŋŊ;VīŋŊ:]:<īŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊ<\īŋŊg;īŋŊīŋŊzīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <x>īŋŊ:ĘĩC:īŋŊ <bīŋŊg;8īŋŊ:R^<īŋŊīŋŊu;ÔĩC:R^<īŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊM^<īŋŊīŋŊz;īŋŊOīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊ1īŋŊ;īŋŊU;]:<K^īŋŊ;4HJ;]:<ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;5īŋŊ;īŋŊV1;jīŋŊīŋŊ;īŋŊīŋŊ<\īŋŊg;īŋŊīŋŊzīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊīŋŊbīŋŊg;8īŋŊ:R^<TīŋŊP;īŋŊU;R^<K^īŋŊ;4HJ;]:<1īŋŊ;īŋŊU;]:<īŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊ<\īŋŊg;īŋŊīŋŊzīŋŊx>īŋŊ:ĘĩC:īŋŊ </īŋŊīŋŊ:OīŋŊ:īŋŊ <TīŋŊP;īŋŊU;R^<bīŋŊg;8īŋŊ:R^<M^<īŋŊīŋŊz;īŋŊOīŋŊY:<īŋŊīŋŊ;īŋŊOīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:Y:<īŋŊīŋŊ;īŋŊOīŋŊM^<īŋŊīŋŊz;īŋŊOīŋŊgīŋŊg;9īŋŊ:P^īŋŊYīŋŊP;īŋŊU;P^īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊīŋŊīŋŊ<\īŋŊg;īŋŊīŋŊz;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ: 1īŋŊ;īŋŊU;]:īŋŊN^īŋŊ;7HJ;]:īŋŊYīŋŊP;īŋŊU;P^īŋŊgīŋŊg;9īŋŊ:P^īŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊ;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;īŋŊīŋŊ<\īŋŊg;īŋŊīŋŊz;5īŋŊ;īŋŊV1;jīŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊN^īŋŊ;7HJ;]:īŋŊ 1īŋŊ;īŋŊU;]:īŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊ;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊīŋŊīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊYīŋŊP;īŋŊU;P^īŋŊīŋŊV1;īŋŊV1;P^īŋŊBĐ´:)Đ´:īŋŊ īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;7īŋŊ;0īŋŊ;īŋŊīŋŊz;īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:N^īŋŊ;7HJ;]:īŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊīŋŊV1;īŋŊV1;P^īŋŊYīŋŊP;īŋŊU;P^īŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊ;7īŋŊ;0īŋŊ;īŋŊīŋŊz;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊN^īŋŊ;7HJ;]:īŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;×Ŗ;×Ŗ;jīŋŊīŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊK^īŋŊ;4HJ;]:<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<×Ŗ;×Ŗ;jīŋŊīŋŊ;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊīŋŊīŋŊTīŋŊP;īŋŊU;R^<īŋŊV1;īŋŊV1;R^<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<K^īŋŊ;4HJ;]:<=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊ/īŋŊīŋŊ:OīŋŊ:īŋŊ <7Đ´:Đ´:īŋŊ <īŋŊV1;īŋŊV1;R^<TīŋŊP;īŋŊU;R^<Y:<īŋŊīŋŊ;īŋŊOīŋŊaīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:aīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊY:<īŋŊīŋŊ;īŋŊOīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊ 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊzīŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊīŋŊīŋŊV1;īŋŊV1;R^<īŋŊU;JīŋŊP;R^<;HJ;G^īŋŊ;]:<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<īŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊīŋŊ;;īŋŊ<uīŋŊīŋŊīŋŊ 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊzīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊ7Đ´:Đ´:īŋŊ <jīŋŊ:īŋŊīŋŊ:īŋŊ <īŋŊU;JīŋŊP;R^<īŋŊV1;īŋŊV1;R^<aīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊīŋŊ;W:<īŋŊOīŋŊīŋŊīŋŊ;;īŋŊ<uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:īŋŊīŋŊ;W:<īŋŊOīŋŊaīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊV1;īŋŊV1;P^īŋŊīŋŊU;LīŋŊP;P^īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊBĐ´:)Đ´:īŋŊ īŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊz; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:līŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊ=HJ;I^īŋŊ;]:īŋŊīŋŊU;LīŋŊP;P^īŋŊīŋŊV1;īŋŊV1;P^īŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;7īŋŊ;0īŋŊ;īŋŊīŋŊz;×Ŗ;×Ŗ;jīŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ=HJ;I^īŋŊ;]:īŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊ;kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊīŋŊīŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊjīŋŊīŋŊ;fīŋŊīŋŊ;]:<;HJ;G^īŋŊ;]:<kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;×Ŗ;×Ŗ;jīŋŊīŋŊ; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;fīŋŊg;īŋŊīŋŊ<īŋŊīŋŊz;īŋŊīŋŊu;īŋŊu<iīŋŊīŋŊ:īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:=HJ;I^īŋŊ;]:īŋŊīŋŊU;1īŋŊ;]:īŋŊKīŋŊ:YīŋŊg;P^īŋŊīŋŊU;LīŋŊP;P^īŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊ;fīŋŊg;īŋŊīŋŊ<īŋŊīŋŊz; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊįģU;1īŋŊ;]:īŋŊ=HJ;I^īŋŊ;]:īŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;īŋŊV1;2īŋŊ;jīŋŊīŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊīŋŊīŋŊJīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;HJ;G^īŋŊ;]:<īŋŊU; +īŋŊC:n>īŋŊ:īŋŊ īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊIīŋŊ:WīŋŊg;R^<īŋŊC:īŋŊīŋŊu;R^<`īŋŊ:īŋŊīŋŊ;]:<īŋŊU; +īŋŊC:n>īŋŊ:īŋŊ īŋŊfīŋŊg;īŋŊīŋŊ<īŋŊīŋŊz;w>īŋŊ:īŋŊu<īŋŊīŋŊz;īŋŊīŋŊīŋŊ:īŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊu;īŋŊu<iīŋŊīŋŊ:īŋŊU;1īŋŊ;]:īŋŊcīŋŊ:īŋŊīŋŊ;]:īŋŊīŋŊīŋŊC:īŋŊīŋŊu;P^īŋŊKīŋŊ:YīŋŊg;P^īŋŊJīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊ;īŋŊīŋŊ:;īŋŊ<īŋŊīŋŊ;w>īŋŊ:īŋŊu<īŋŊīŋŊz;fīŋŊg;īŋŊīŋŊ<īŋŊīŋŊz;īŋŊV1;2īŋŊ;jīŋŊīŋŊ.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊcīŋŊ:īŋŊīŋŊ;]:īŋŊīŋŊU;1īŋŊ;]:īŋŊīŋŊV1;2īŋŊ;jīŋŊīŋŊ;.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊīŋŊ:;īŋŊ<īŋŊīŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊīŋŊīŋŊīŋŊīŋŊ:;īŋŊ<īŋŊīŋŊīŋŊ.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊįģU; +īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ/;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ=;īŋŊtpīŋŊīŋŊwīŋŊ: +īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;fΤīŋŊxīŋŊ:; +īŋŊīŋŊīŋŊīŋŊīŋŊ: +īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊo;īŋŊE0īŋŊ\īŋŊ:8īŋŊ;DīŋŊ(īŋŊīŋŊ9īŋŊ:3īŋŊīŋŊ<~īŋŊBīŋŊ +īŋŊzīŋŊīŋŊ;īŋŊīŋŊ;<īŋŊīŋŊīŋŊ;4īŋŊ;'GīŋŊīŋŊuīŋŊ*; +īŋŊzīŋŊīŋŊ; īŋŊīŋŊ;% +īŋŊzīŋŊīŋŊ;ZīŋŊ:<JLīŋŊlmīŋŊ;īŋŊ]<qīŋŊ$ÎŦ;īŋŊīŋŊ;<īŋŊīŋŊīŋŊ; +īŋŊzīŋŊīŋŊ; +< +<īŋŊīŋŊM<īŋŊīŋŊ`īŋŊīŋŊīŋŊīŋŊ;-<-īŋŊīŋŊīŋŊīŋŊīŋŊ; +īŋŊīŋŊīŋŊīŋŊ: +īŋŊä: +īŋŊīŋŊīŋŊīŋŊ:īŋŊ
V< +īŋŊä:īŋŊīŋŊīŋŊ:īŋŊYīŋŊ+īŋŊ:īŋŊ]<qīŋŊ$ÎŦ; +īŋŊīŋŊīŋŊīŋŊ:īŋŊ
VīŋŊ +īŋŊä:īŋŊīŋŊ×ēīŋŊYīŋŊ+īŋŊ:īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊWw;; +īŋŊīŋŊīŋŊīŋŊ: +īŋŊä: +<īŋŊīŋŊMīŋŊīŋŊīŋŊ`īŋŊīŋŊīŋŊīŋŊ;YīŋŊ:īŋŊJLīŋŊlmīŋŊ; +< +īŋŊzīŋŊīŋŊ;YīŋŊ:īŋŊJLīŋŊlmīŋŊ; +īŋŊzīŋŊīŋŊ;īŋŊīŋŊCīŋŊīŋŊīŋŊ;īŋŊ]īŋŊrīŋŊ$ÎŦ;īŋŊ
VīŋŊ +īŋŊīŋŊīŋŊ:īŋŊ;īŋŊ
VīŋŊ +īŋŊīŋŊīŋŊ:īŋŊ;īŋŊl=īŋŊ(`īŋŊīŋŊ~"; +īŋŊzīŋŊīŋŊ;īŋŊīŋŊīŋŊ& +īŋŊzīŋŊīŋŊ; +īŋŊīŋŊīŋŊ:īŋŊ;īŋŊīŋŊīŋŊīŋŊ"īŋŊSīŋŊīŋŊīŋŊīŋŊ:īŋŊ
VīŋŊ +īŋŊīŋŊīŋŊ:īŋŊ; +#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9KīŋŊĐģ$īŋŊîēÛ:īŋŊīŋŊīŋŊīŋŊ"īŋŊSīŋŊīŋŊīŋŊīŋŊ: +#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9īŋŊīŋŊ:īŋŊīŋŊh!īŋŊ: +#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9 +#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9 +īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ/īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊËēīŋŊīŋŊīŋŊīŋŊ īŋŊw: +īŋŊīŋŊīŋŊīŋŊīŋŊ: +īŋŊīŋŊīŋŊīŋŊīŋŊ: +īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊdΤīŋŊxīŋŊ:;īŋŊ=īŋŊ~tpīŋŊīŋŊwīŋŊ:īŋŊīŋŊ/īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ: +īŋŊīŋŊ +īŋŊīŋŊ +īŋŊīŋŊ +īŋŊīŋŊ +EīŋŊ +EīŋŊ +EīŋŊ +EīŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ +< +< +< +< +< +< +< +< +īŋŊ +īŋŊ +īŋŊ +īŋŊ +īŋŊ; +īŋŊ; +: +: +īŋŊ; +īŋŊ; +: +: +E: +E: +E: +E: + + + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ + +
"! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRP +@īŋŊīŋŊ@īŋŊīŋŊ@@03@RU@tw@īŋŊīŋŊ@īŋŊīŋŊ@īŋŊīŋŊ@īŋŊīŋŊ@""@@D$@bf&@īŋŊīŋŊ(@īŋŊīŋŊ*@īŋŊīŋŊ,@īŋŊīŋŊ.@1@.33@PU5@rw7@īŋŊīŋŊ9@īŋŊīŋŊ;@īŋŊīŋŊ=@īŋŊīŋŊ?@"B@>DD@`fF@īŋŊīŋŊH@īŋŊīŋŊJ@īŋŊīŋŊL@īŋŊīŋŊN@ +Q@,3S@NUU@pwW@īŋŊīŋŊY@īŋŊīŋŊ[@īŋŊīŋŊ]@īŋŊīŋŊ_@"b@<Dd@^ff@īŋŊīŋŊh@īŋŊīŋŊj@īŋŊīŋŊl@īŋŊīŋŊn@q@*3s@LUu@nww@īŋŊīŋŊy@īŋŊīŋŊ{@īŋŊīŋŊ}@īŋŊīŋŊ@īŋŊ@"īŋŊ@.3īŋŊ@?DīŋŊ@PUīŋŊ@afīŋŊ@rwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖ@īŋŊŨ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@-3īŋŊ@>DīŋŊ@OUīŋŊ@`fīŋŊ@qwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖ@īŋŊŨ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@ +īŋŊ@"īŋŊ@,3īŋŊ@=DīŋŊ@NUīŋŊ@_fīŋŊ@pwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖŦ@īŋŊŨ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@ īŋŊ@"īŋŊ@+3īŋŊ@<DīŋŊ@MUīŋŊ@^fīŋŊ@owīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖŧ@īŋŊŨŊ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@*3īŋŊ@;DīŋŊ@LUīŋŊ@]fīŋŊ@nwīŋŊ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@)3īŋŊ@:DīŋŊ@KUīŋŊ@\fīŋŊ@mwīŋŊ@~īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@(3īŋŊ@9DīŋŊ@JUīŋŊ@[fīŋŊ@ +-? +īŋŊg;t?3īŋŊīŋŊ;w>~?īŋŊīŋŊ7< }?}īŋŊ<,īŋŊ{?īŋŊ=īŋŊ<z?īŋŊ%īŋŊ<īŋŊ>x?īŋŊīŋŊ=īŋŊ#v?īŋŊC=HīŋŊs?īŋŊīŋŊk=3Aq?īŋŊīŋŊ=d~n?LīŋŊīŋŊ=īŋŊīŋŊk?īŋŊīŋŊīŋŊ=`h?īŋŊīŋŊīŋŊ=īŋŊe?īŋŊīŋŊīŋŊ=īŋŊa?OīŋŊ>-īŋŊ]?>?īŋŊY?īŋŊ(>VīŋŊU?ÍĨ8>īŋŊīŋŊQ?īŋŊīŋŊI> +īŋŊD?TīŋŊ>īŋŊīŋŊ??hīŋŊīŋŊ>L?;?īŋŊ,īŋŊ>īŋŊi6?īŋŊīŋŊ>īŋŊ}1?īŋŊīŋŊ>īŋŊ},?3(īŋŊ>īŋŊk'?rkīŋŊ>GJ"?īŋŊīŋŊ>īŋŊ?īŋŊ?īŋŊ>īŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?2`īŋŊ>īŋŊO
?AīŋŊ>īŋŊīŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?īŋŊīŋŊ?īŋŊīŋŊ>īŋŊīŋŊ?īŋŊīŋŊ>īŋŊO
?q`īŋŊ>īŋŊīŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?!@īŋŊ>īŋŊ?QīŋŊīŋŊ>*J"?īŋŊkīŋŊ>īŋŊk'?n(īŋŊ>īŋŊ},?īŋŊīŋŊ>īŋŊ}1?īŋŊīŋŊ>ji6?,-īŋŊ>/?;?īŋŊīŋŊīŋŊ>īŋŊīŋŊ??īŋŊīŋŊ>īŋŊD?CīŋŊm>īŋŊ&I?8e[>īŋŊM?aīŋŊI>tīŋŊQ?.īŋŊ8>=īŋŊU? +(>(īŋŊY?a>īŋŊ]?īŋŊīŋŊ>īŋŊa?{īŋŊīŋŊ=īŋŊe?HīŋŊīŋŊ=īŋŊ_h?f +z?īŋŊ>īŋŊ<%īŋŊ{?\īŋŊ<īŋŊ}?īŋŊ8<s>~?fīŋŊīŋŊ;q?\īŋŊg;ÛĢ?=JīŋŊ:īŋŊīŋŊ?īŋŊīŋŊ9vīŋŊ? +īŋŊ^? +īŋŊ>? +īŋŊīŋŊ> +īŋŊ> +īŋŊ> +> +g; +īŋŊ#īŋŊ diff --git a/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf new file mode 100644 index 000000000..69f451fc2 --- /dev/null +++ b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf @@ -0,0 +1,276 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 1876, + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 1876, + "type": "VEC4" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.009999998, + 0.009999991, + 0.01 + ], + "min": [ + -0.0100000026, + -0.0100000035, + -0.01 + ] + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Ship" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.0313265175, + 0.0226246975, + 0.008465132 + ], + "min": [ + -0.0313265137, + -0.022857653, + 0.0 + ], + "name": "Ship" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Ship" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Blob" + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.008781092, + 0.0, + 0.0 + ], + "min": [ + -0.008781091, + -0.0007655843, + 0.0 + ], + "name": "Blob" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Blob" + }, + { + "bufferView": 9, + "componentType": 5123, + "count": 2880, + "type": "SCALAR" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 217, + "type": "SCALAR", + "max": [ + 7.19999456 + ], + "min": [ + 0.0 + ] + }, + { + "bufferView": 11, + "componentType": 5126, + "count": 434, + "type": "SCALAR" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "weights" + } + } + ], + "samplers": [ + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + } + ], + "name": "Globe" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 22512, + "byteLength": 30016 + }, + { + "buffer": 0, + "byteOffset": 52528, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 75040, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 97552, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 120064, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 142576, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 165088, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 187600, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 210112, + "byteLength": 5760 + }, + { + "buffer": 0, + "byteOffset": 215872, + "byteLength": 868 + }, + { + "buffer": 0, + "byteOffset": 216740, + "byteLength": 1736 + } + ], + "buffers": [ + { + "uri": "AnimatedMorphSphere.bin", + "byteLength": 218476 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 0, + "TANGENT": 1, + "POSITION": 2 + }, + "indices": 9, + "material": 0, + "targets": [ + { + "NORMAL": 3, + "POSITION": 4, + "TANGENT": 5 + }, + { + "NORMAL": 6, + "POSITION": 7, + "TANGENT": 8 + } + ] + } + ], + "weights": [ + 0.0, + 0.0 + ], + "name": "Sphere" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + }, + "name": "No Name" + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0.0, + 0.7071067, + -0.7071068, + 0.0 + ], + "scale": [ + 100.0, + 100.0, + 100.0 + ], + "name": "AnimatedMorphSphere" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +}
\ No newline at end of file diff --git a/test/models/glTF2/MorphPrimitivesTest/LICENSE.md b/test/models/glTF2/MorphPrimitivesTest/LICENSE.md new file mode 100644 index 000000000..5ed346890 --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/LICENSE.md @@ -0,0 +1,17 @@ +# LICENSE file for the model: Morph-Primitives Test + +All files in this directory tree are licensed as indicated below. + +* All files directly associated with the model including all text, image and binary files: + + * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + + * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +* This file and all other metadocumentation files including "metadata.json": + + * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +Full license text of these licenses are available at the links above + +#### Generated by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/MorphPrimitivesTest/README.body.md b/test/models/glTF2/MorphPrimitivesTest/README.body.md new file mode 100644 index 000000000..984ccd1d7 --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/README.body.md @@ -0,0 +1,21 @@ +## Screenshot + + + +## Description + +This model contains a simple mesh with two primitives: A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant. + +Each primitive has a morph target that creates an elevated area within these quadrants. The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above. + +## Common Problems + +If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested. + +If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh. + +## Author + +Model by [@ft-lab](https://github.com/ft-lab). + + diff --git a/test/models/glTF2/MorphPrimitivesTest/README.md b/test/models/glTF2/MorphPrimitivesTest/README.md new file mode 100644 index 000000000..80dacfbcd --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/README.md @@ -0,0 +1,50 @@ +# Morph-Primitives Test + +## Tags + +[core](../../Models-core.md), [testing](../../Models-testing.md) + +## Summary + +Tests a morph target on multiple primitives. + +## Operations + +* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb) in SampleViewer +* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb) +* [Model Directory](./) + +## Screenshot + + + +## Description + +This model contains a simple mesh with two primitives: A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant. + +Each primitive has a morph target that creates an elevated area within these quadrants. The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above. + +## Common Problems + +If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested. + +If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh. + +## Author + +Model by [@ft-lab](https://github.com/ft-lab). + + + + +## Legal + +© 2018, ft-lab. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode) + + - ft-lab for Everything + +© 2020, Frank Galligan. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode) + + - Frank Galligan for DRACO compression + +#### Assembled by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin Binary files differnew file mode 100644 index 000000000..7f269e17a --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf new file mode 100644 index 000000000..bd3ad0e31 --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf @@ -0,0 +1,331 @@ +{ + "asset": { + "generator": "glTF Converter for Shade3D", + "version": "2.0", + "extras": { + "title": "multiple_primitives", + "author": "ft-lab", + "license": "CC BY-4.0 (https://creativecommons.org/licenses/by/4.0/)" + } + }, + "accessors": [ + { + "bufferView": 0, + "componentType": 5123, + "count": 72, + "type": "SCALAR", + "byteOffset": 0 + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "byteOffset": 0 + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "max": [ + 0.5, + 0, + 0.5 + ], + "min": [ + -0.5, + 0, + -0.5 + ], + "byteOffset": 0 + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 21, + "type": "VEC2", + "byteOffset": 0 + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "max": [ + 0, + 0.20000000298023224, + 0 + ], + "min": [ + 0, + 0, + 0 + ], + "byteOffset": 0 + }, + { + "bufferView": 5, + "componentType": 5123, + "count": 24, + "type": "SCALAR", + "byteOffset": 0 + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "byteOffset": 0 + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "max": [ + 0.5, + 0, + 0 + ], + "min": [ + 0, + 0, + -0.5 + ], + "byteOffset": 0 + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 9, + "type": "VEC2", + "byteOffset": 0 + }, + { + "bufferView": 9, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "max": [ + 0, + 0.20000000298023224, + 0 + ], + "min": [ + 0, + 0, + 0 + ], + "byteOffset": 0 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 144, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 144, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 396, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 648, + "byteLength": 168, + "target": 34962, + "byteStride": 8 + }, + { + "buffer": 0, + "byteOffset": 816, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1068, + "byteLength": 48, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 1116, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1224, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1332, + "byteLength": 72, + "target": 34962, + "byteStride": 8 + }, + { + "buffer": 0, + "byteOffset": 1404, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + } + ], + "buffers": [ + { + "name": "MorphPrimitivesTest", + "byteLength": 1512, + "uri": "MorphPrimitivesTest.bin" + } + ], + "images": [ + { + "name": "uv_texture.jpg", + "mimeType": "image/jpeg", + "uri": "uv_texture.jpg" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 1, + 0, + 0, + 1 + ], + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + }, + "name": "red", + "emissiveFactor": [ + 0, + 0, + 0 + ], + "alphaMode": "OPAQUE", + "doubleSided": false + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0, + 1, + 0, + 1 + ], + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + }, + "name": "green", + "emissiveFactor": [ + 0, + 0, + 0 + ], + "alphaMode": "OPAQUE", + "doubleSided": false + } + ], + "meshes": [ + { + "weights": [ + 0.5 + ], + "name": "mesh", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2, + "TEXCOORD_0": 3 + }, + "indices": 0, + "material": 0, + "targets": [ + { + "POSITION": 4 + } + ], + "mode": 4 + }, + { + "attributes": { + "POSITION": 7, + "NORMAL": 6, + "TEXCOORD_0": 8 + }, + "indices": 5, + "material": 1, + "targets": [ + { + "POSITION": 9 + } + ], + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "name": "ãĢãŧãããŧã" + }, + { + "mesh": 0, + "name": "mesh" + } + ], + "samplers": [ + { + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "scenes": [ + { + "nodes": [ + 0 + ], + "name": "Scene" + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "scene": 0 +} diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg b/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg Binary files differnew file mode 100644 index 000000000..7f63873f9 --- /dev/null +++ b/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg diff --git a/test/models/glTF2/MorphStressTest/LICENSE.md b/test/models/glTF2/MorphStressTest/LICENSE.md new file mode 100644 index 000000000..2e9a26b9f --- /dev/null +++ b/test/models/glTF2/MorphStressTest/LICENSE.md @@ -0,0 +1,15 @@ +# LICENSE file for the model: Morph Stress Test + +All files in this directory tree are licensed as indicated below. + +* All files directly associated with the model including all text, image and binary files: + + * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +* This file and all other metadocumentation files including "metadata.json": + + * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +Full license text of these licenses are available at the links above + +#### Generated by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/MorphStressTest/README.body.md b/test/models/glTF2/MorphStressTest/README.body.md new file mode 100644 index 000000000..704ebd1e7 --- /dev/null +++ b/test/models/glTF2/MorphStressTest/README.body.md @@ -0,0 +1,62 @@ +## Screenshot + + + +## Description + +This model has a base mesh, plus eight morph targets. The base and each of the morph targets has +both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested +by a typical implementation. This number can be too high for many realtime graphics systems, and +the client runtime may take steps to limit the overall number of morph targets and/or limit the +number of active morph targets. + +As such, this model is not expected to render correctly everywhere. Instead, it pushes the limits +to see how many morph targets can move at once before problems become apparent. + +## Animations + +Three animations are included: + +--- +### "Individuals" + + + +Each morph target is exercised one at a time, and returns to zero strength before the next one +starts to move. This offers runtimes the best chance of success, as vertex attributes need only +be allocated for one morph target at a time. Even so, systems that pre-allocate morph target +attributes may place an upper limit here, allowing only some of the test blocks to move. + +--- +### "TheWave" + + + +This animation tests a wave of morph targets being activated simultaneously. This does require +a high number of vertex attributes to be available. If glitches in movement are observed, +continue on to the "Pulse" animation for closer inspection. + +--- +### "Pulse" + + + +This is the most stressful test, with all 8 morph targets reaching full strength before any +begin to subside. Some runtimes may place limits on how many morph targets can be active at +once, resulting in a distinctive visual pattern here: Only the first N test blocks will +appear to move, where N is the number of simultaneous active morph targets allowed. Test +blocks on the right will remain frozen in the starting position until the first few blocks +on the left have returned to rest. After the blocks on the left have returned to rest, they +could relinquish their vertex attributes to blocks on the right, allowing those blocks to +"catch up" to their assigned positions in the animation. + +It is also possible that there could be a hard limit on the number of morph targets, regardless +of whether they are active or not. In this case, only the first N blocks will move at all, +and the remainder will be frozen the entire time. + +--- +## Implementation Notes + +BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation +in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE). + diff --git a/test/models/glTF2/MorphStressTest/README.md b/test/models/glTF2/MorphStressTest/README.md new file mode 100644 index 000000000..71eb60540 --- /dev/null +++ b/test/models/glTF2/MorphStressTest/README.md @@ -0,0 +1,87 @@ +# Morph Stress Test + +## Tags + +[core](../../Models-core.md), [testing](../../Models-testing.md) + +## Summary + +Tests up to 8 morph targets. + +## Operations + +* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb) in SampleViewer +* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb) +* [Model Directory](./) + +## Screenshot + + + +## Description + +This model has a base mesh, plus eight morph targets. The base and each of the morph targets has +both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested +by a typical implementation. This number can be too high for many realtime graphics systems, and +the client runtime may take steps to limit the overall number of morph targets and/or limit the +number of active morph targets. + +As such, this model is not expected to render correctly everywhere. Instead, it pushes the limits +to see how many morph targets can move at once before problems become apparent. + +## Animations + +Three animations are included: + +--- +### "Individuals" + + + +Each morph target is exercised one at a time, and returns to zero strength before the next one +starts to move. This offers runtimes the best chance of success, as vertex attributes need only +be allocated for one morph target at a time. Even so, systems that pre-allocate morph target +attributes may place an upper limit here, allowing only some of the test blocks to move. + +--- +### "TheWave" + + + +This animation tests a wave of morph targets being activated simultaneously. This does require +a high number of vertex attributes to be available. If glitches in movement are observed, +continue on to the "Pulse" animation for closer inspection. + +--- +### "Pulse" + + + +This is the most stressful test, with all 8 morph targets reaching full strength before any +begin to subside. Some runtimes may place limits on how many morph targets can be active at +once, resulting in a distinctive visual pattern here: Only the first N test blocks will +appear to move, where N is the number of simultaneous active morph targets allowed. Test +blocks on the right will remain frozen in the starting position until the first few blocks +on the left have returned to rest. After the blocks on the left have returned to rest, they +could relinquish their vertex attributes to blocks on the right, allowing those blocks to +"catch up" to their assigned positions in the animation. + +It is also possible that there could be a hard limit on the number of morph targets, regardless +of whether they are active or not. In this case, only the first N blocks will move at all, +and the remainder will be frozen the entire time. + +--- +## Implementation Notes + +BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation +in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE). + + + +## Legal + +© 2021, Analytical Graphics, Inc.. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode) + + - Ed Mackey for Everything + +#### Assembled by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/MorphStressTest/glTF/Base_AO.png b/test/models/glTF2/MorphStressTest/glTF/Base_AO.png Binary files differnew file mode 100644 index 000000000..567255a7f --- /dev/null +++ b/test/models/glTF2/MorphStressTest/glTF/Base_AO.png diff --git a/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png b/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png Binary files differnew file mode 100644 index 000000000..72da1c22c --- /dev/null +++ b/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png diff --git a/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin Binary files differnew file mode 100644 index 000000000..53ebd6724 --- /dev/null +++ b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin diff --git a/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf new file mode 100644 index 000000000..560cb2b1d --- /dev/null +++ b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf @@ -0,0 +1,999 @@ +{ + "asset" : { + "copyright" : "CC-BY 4.0 Copyright 2021 Analytical Graphics, Inc. Model and Textures by Ed Mackey.", + "generator" : "Khronos glTF Blender I/O v1.5.13", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Main" + } + ], + "animations" : [ + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "weights" + } + } + ], + "name" : "Individuals", + "samplers" : [ + { + "input" : 42, + "interpolation" : "LINEAR", + "output" : 43 + } + ] + }, + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "weights" + } + } + ], + "name" : "TheWave", + "samplers" : [ + { + "input" : 44, + "interpolation" : "LINEAR", + "output" : 45 + } + ] + }, + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "weights" + } + } + ], + "name" : "Pulse", + "samplers" : [ + { + "input" : 46, + "interpolation" : "LINEAR", + "output" : 47 + } + ] + } + ], + "materials" : [ + { + "doubleSided" : true, + "name" : "Base", + "occlusionTexture" : { + "index" : 0, + "texCoord" : 1 + }, + "pbrMetallicRoughness" : { + "baseColorTexture" : { + "index" : 1 + }, + "metallicFactor" : 0, + "roughnessFactor" : 0.4000000059604645 + } + }, + { + "doubleSided" : true, + "name" : "TestMaterial", + "pbrMetallicRoughness" : { + "baseColorTexture" : { + "index" : 2 + }, + "metallicFactor" : 0, + "roughnessFactor" : 0.5 + } + } + ], + "meshes" : [ + { + "extras" : { + "targetNames" : [ + "Key 1", + "Key 2", + "Key 3", + "Key 4", + "Key 5", + "Key 6", + "Key 7", + "Key 8" + ] + }, + "name" : "Cube", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2, + "TEXCOORD_1" : 3 + }, + "indices" : 4, + "material" : 0, + "targets" : [ + { + "POSITION" : 5, + "NORMAL" : 6 + }, + { + "POSITION" : 7, + "NORMAL" : 8 + }, + { + "POSITION" : 9, + "NORMAL" : 10 + }, + { + "POSITION" : 11, + "NORMAL" : 12 + }, + { + "POSITION" : 13, + "NORMAL" : 14 + }, + { + "POSITION" : 15, + "NORMAL" : 16 + }, + { + "POSITION" : 17, + "NORMAL" : 18 + }, + { + "POSITION" : 19, + "NORMAL" : 20 + } + ] + }, + { + "attributes" : { + "POSITION" : 21, + "NORMAL" : 22, + "TEXCOORD_0" : 23, + "TEXCOORD_1" : 24 + }, + "indices" : 25, + "material" : 1, + "targets" : [ + { + "POSITION" : 26, + "NORMAL" : 27 + }, + { + "POSITION" : 28, + "NORMAL" : 29 + }, + { + "POSITION" : 30, + "NORMAL" : 31 + }, + { + "POSITION" : 32, + "NORMAL" : 33 + }, + { + "POSITION" : 34, + "NORMAL" : 35 + }, + { + "POSITION" : 36, + "NORMAL" : 37 + }, + { + "POSITION" : 38, + "NORMAL" : 39 + }, + { + "POSITION" : 40, + "NORMAL" : 41 + } + ] + } + ], + "weights" : [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ], + "textures" : [ + { + "sampler" : 0, + "source" : 0 + }, + { + "sampler" : 0, + "source" : 1 + }, + { + "sampler" : 0, + "source" : 2 + } + ], + "images" : [ + { + "mimeType" : "image/png", + "name" : "Base_AO", + "uri" : "Base_AO.png" + }, + { + "mimeType" : "image/png", + "name" : "TinyGrid", + "uri" : "TinyGrid.png" + }, + { + "mimeType" : "image/png", + "name" : "ColorSwatches", + "uri" : "ColorSwatches.png" + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 24, + "max" : [ + 2, + 0, + 0.5 + ], + "min" : [ + -2, + -0.10000002384185791, + -0.5 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 4, + "componentType" : 5123, + "count" : 36, + "type" : "SCALAR" + }, + { + "bufferView" : 5, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 6, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 7, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 8, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 9, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 10, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 11, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 12, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 13, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 14, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 15, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 16, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 17, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 18, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 19, + "componentType" : 5126, + "count" : 24, + "max" : [ + 0, + 0, + 0 + ], + "min" : [ + 0, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 20, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 21, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 1.875, + 0.5, + 0.25 + ], + "min" : [ + -1.875, + 0, + -0.25 + ], + "type" : "VEC3" + }, + { + "bufferView" : 22, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 23, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC2" + }, + { + "bufferView" : 24, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC2" + }, + { + "bufferView" : 25, + "componentType" : 5123, + "count" : 7200, + "type" : "SCALAR" + }, + { + "bufferView" : 26, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.04999995231628418, + 1, + 0 + ], + "min" : [ + -0.04999995231628418, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 27, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 28, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.04999995231628418, + 1, + 0 + ], + "min" : [ + -0.04999995231628418, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 29, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 30, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.050000011920928955, + 1, + 0 + ], + "min" : [ + -0.050000011920928955, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 31, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 32, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.050000011920928955, + 1, + 0 + ], + "min" : [ + -0.04999999701976776, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 33, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 34, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.04999999701976776, + 1, + 0 + ], + "min" : [ + -0.050000011920928955, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 35, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 36, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.050000011920928955, + 1, + 0 + ], + "min" : [ + -0.050000011920928955, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 37, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 38, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.04999995231628418, + 1, + 0 + ], + "min" : [ + -0.04999995231628418, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 39, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 40, + "componentType" : 5126, + "count" : 1504, + "max" : [ + 0.04999995231628418, + 1, + 0 + ], + "min" : [ + -0.04999995231628418, + 0, + 0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 41, + "componentType" : 5126, + "count" : 1504, + "type" : "VEC3" + }, + { + "bufferView" : 42, + "componentType" : 5126, + "count" : 281, + "max" : [ + 9.366666666666667 + ], + "min" : [ + 0.03333333333333333 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 43, + "componentType" : 5126, + "count" : 2248, + "type" : "SCALAR" + }, + { + "bufferView" : 44, + "componentType" : 5126, + "count" : 59, + "max" : [ + 1.9666666666666666 + ], + "min" : [ + 0.03333333333333333 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 45, + "componentType" : 5126, + "count" : 472, + "type" : "SCALAR" + }, + { + "bufferView" : 46, + "componentType" : 5126, + "count" : 191, + "max" : [ + 6.366666666666666 + ], + "min" : [ + 0.03333333333333333 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 47, + "componentType" : 5126, + "count" : 1528, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 288 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 576 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 768 + }, + { + "buffer" : 0, + "byteLength" : 72, + "byteOffset" : 960 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1032 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1320 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1608 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1896 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 2184 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 2472 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 2760 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 3048 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 3336 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 3624 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 3912 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 4200 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 4488 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 4776 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 5064 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 5352 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 5640 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 23688 + }, + { + "buffer" : 0, + "byteLength" : 12032, + "byteOffset" : 41736 + }, + { + "buffer" : 0, + "byteLength" : 12032, + "byteOffset" : 53768 + }, + { + "buffer" : 0, + "byteLength" : 14400, + "byteOffset" : 65800 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 80200 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 98248 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 116296 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 134344 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 152392 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 170440 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 188488 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 206536 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 224584 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 242632 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 260680 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 278728 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 296776 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 314824 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 332872 + }, + { + "buffer" : 0, + "byteLength" : 18048, + "byteOffset" : 350920 + }, + { + "buffer" : 0, + "byteLength" : 1124, + "byteOffset" : 368968 + }, + { + "buffer" : 0, + "byteLength" : 8992, + "byteOffset" : 370092 + }, + { + "buffer" : 0, + "byteLength" : 236, + "byteOffset" : 379084 + }, + { + "buffer" : 0, + "byteLength" : 1888, + "byteOffset" : 379320 + }, + { + "buffer" : 0, + "byteLength" : 764, + "byteOffset" : 381208 + }, + { + "buffer" : 0, + "byteLength" : 6112, + "byteOffset" : 381972 + } + ], + "samplers" : [ + { + "magFilter" : 9729, + "minFilter" : 9987 + } + ], + "buffers" : [ + { + "byteLength" : 388084, + "uri" : "MorphStressTest.bin" + } + ] +} diff --git a/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png b/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png Binary files differnew file mode 100644 index 000000000..81d040a68 --- /dev/null +++ b/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png diff --git a/test/models/glTF2/SimpleMorph/LICENSE.md b/test/models/glTF2/SimpleMorph/LICENSE.md new file mode 100644 index 000000000..a94108529 --- /dev/null +++ b/test/models/glTF2/SimpleMorph/LICENSE.md @@ -0,0 +1,15 @@ +# LICENSE file for the model: Simple Morph + +All files in this directory tree are licensed as indicated below. + +* All files directly associated with the model including all text, image and binary files: + + * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"] + +* This file and all other metadocumentation files including "metadata.json": + + * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"] + +Full license text of these licenses are available at the links above + +#### Generated by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/SimpleMorph/README.body.md b/test/models/glTF2/SimpleMorph/README.body.md new file mode 100644 index 000000000..02bb773bc --- /dev/null +++ b/test/models/glTF2/SimpleMorph/README.body.md @@ -0,0 +1,17 @@ +## Screenshot + + + +## Notes + +This is an example of a glTF asset that uses morph targets, as described in the +[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md) +section of the glTF tutorial. + +## Data layout + +The following image shows the data layout of this sample: + + + + diff --git a/test/models/glTF2/SimpleMorph/README.md b/test/models/glTF2/SimpleMorph/README.md new file mode 100644 index 000000000..41f27498d --- /dev/null +++ b/test/models/glTF2/SimpleMorph/README.md @@ -0,0 +1,41 @@ +# Simple Morph + +## Tags + +[core](../../Models-core.md), [testing](../../Models-testing.md) + +## Summary + +A triangle with a morph animation applied + +## Operations + +* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/SimpleMorph/glTF/SimpleMorph.gltf) in SampleViewer +* [Model Directory](./) + +## Screenshot + + + +## Notes + +This is an example of a glTF asset that uses morph targets, as described in the +[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md) +section of the glTF tutorial. + +## Data layout + +The following image shows the data layout of this sample: + + + + + + +## Legal + +© 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode) + + - javagl for Everything + +#### Assembled by modelmetadata
\ No newline at end of file diff --git a/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf b/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf new file mode 100644 index 000000000..50091894f --- /dev/null +++ b/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf @@ -0,0 +1,189 @@ +{ + "scene" : 0, + "scenes":[ + { + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0 + } + ], + "meshes":[ + { + "primitives":[ + { + "attributes":{ + "POSITION":1 + }, + "targets":[ + { + "POSITION":2 + }, + { + "POSITION":3 + } + ], + "indices":0 + } + ], + "weights":[ + 0.5, + 0.5 + ] + } + ], + "animations":[ + { + "samplers":[ + { + "input":4, + "interpolation":"LINEAR", + "output":5 + } + ], + "channels":[ + { + "sampler":0, + "target":{ + "node":0, + "path":"weights" + } + } + ] + } + ], + "buffers":[ + { + "uri" : "simpleMorphGeometry.bin", + "byteLength":116 + }, + { + "uri" : "simpleMorphAnimation.bin", + "byteLength":60 + } + ], + "bufferViews":[ + { + "buffer":0, + "byteOffset":0, + "byteLength":6, + "target":34963 + }, + { + "buffer":0, + "byteOffset":8, + "byteLength":108, + "byteStride":12, + "target":34962 + }, + { + "buffer":1, + "byteOffset":0, + "byteLength":20 + }, + { + "buffer":1, + "byteOffset":20, + "byteLength":40 + } + ], + "accessors":[ + { + "bufferView":0, + "byteOffset":0, + "componentType":5123, + "count":3, + "type":"SCALAR", + "max":[ + 2 + ], + "min":[ + 0 + ] + }, + { + "bufferView":1, + "byteOffset":0, + "componentType":5126, + "count":3, + "type":"VEC3", + "max":[ + 1.0, + 0.5, + 0.0 + ], + "min":[ + 0.0, + 0.0, + 0.0 + ] + }, + { + "bufferView":1, + "byteOffset":36, + "componentType":5126, + "count":3, + "type":"VEC3", + "max":[ + 0.0, + 1.0, + 0.0 + ], + "min":[ + -1.0, + 0.0, + 0.0 + ] + }, + { + "bufferView":1, + "byteOffset":72, + "componentType":5126, + "count":3, + "type":"VEC3", + "max":[ + 1.0, + 1.0, + 0.0 + ], + "min":[ + 0.0, + 0.0, + 0.0 + ] + }, + { + "bufferView":2, + "byteOffset":0, + "componentType":5126, + "count":5, + "type":"SCALAR", + "max":[ + 4.0 + ], + "min":[ + 0.0 + ] + }, + { + "bufferView":3, + "byteOffset":0, + "componentType":5126, + "count":10, + "type":"SCALAR", + "max":[ + 1.0 + ], + "min":[ + 0.0 + ] + } + ], + "asset":{ + "version":"2.0" + } +} diff --git a/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin b/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin Binary files differnew file mode 100644 index 000000000..bbd0ee686 --- /dev/null +++ b/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin diff --git a/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin b/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin Binary files differnew file mode 100644 index 000000000..70b73c2c8 --- /dev/null +++ b/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin diff --git a/test/models/glTF2/draco/robot.glb b/test/models/glTF2/draco/robot.glb Binary files differnew file mode 100644 index 000000000..81679a60f --- /dev/null +++ b/test/models/glTF2/draco/robot.glb diff --git a/test/models/glTF2/ref/README.md b/test/models/glTF2/ref/README.md new file mode 100644 index 000000000..63be83f11 --- /dev/null +++ b/test/models/glTF2/ref/README.md @@ -0,0 +1,16 @@ +# glTF 3D model reference images + +## AnimatedMorphCube +<img alt="AnimatedMorphCube" src="screenshots/AnimatedMorphCube.gif" width=180 /> + +## AnimatedMorphSphere +<img alt="AnimatedMorphSphere" src="screenshots/AnimatedMorphSphere.gif" width=180 /> + +## MorphPrimitivesTest +<img alt="MorphPrimitivesTest" src="screenshots/MorphPrimitivesTest.gif" width=180 /> + +## MorphStressTest +<img alt="MorphStressTest" src="screenshots/MorphStressTest_cycle_animations.gif" width=180 /> + +## SimpleMorph +<img alt="SimpleMorph" src="screenshots/SimpleMorph.gif" width=180 /> diff --git a/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif b/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif Binary files differnew file mode 100644 index 000000000..5c73ff8af --- /dev/null +++ b/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif diff --git a/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif b/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif Binary files differnew file mode 100644 index 000000000..6e33d01b5 --- /dev/null +++ b/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif diff --git a/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif b/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif Binary files differnew file mode 100644 index 000000000..fbd100620 --- /dev/null +++ b/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif diff --git a/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif b/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif Binary files differnew file mode 100644 index 000000000..877b78f20 --- /dev/null +++ b/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif diff --git a/test/models/glTF2/ref/screenshots/SimpleMorph.gif b/test/models/glTF2/ref/screenshots/SimpleMorph.gif Binary files differnew file mode 100644 index 000000000..d883b352c --- /dev/null +++ b/test/models/glTF2/ref/screenshots/SimpleMorph.gif diff --git a/test/unit/AbstractImportExportBase.cpp b/test/unit/AbstractImportExportBase.cpp index 80e53500d..eaa72781c 100644 --- a/test/unit/AbstractImportExportBase.cpp +++ b/test/unit/AbstractImportExportBase.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/AssimpAPITest.cpp b/test/unit/AssimpAPITest.cpp index 5797bde80..e15217e70 100644 --- a/test/unit/AssimpAPITest.cpp +++ b/test/unit/AssimpAPITest.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/AssimpAPITest_aiMatrix3x3.cpp b/test/unit/AssimpAPITest_aiMatrix3x3.cpp index 3a12b1e55..54e9719ea 100644 --- a/test/unit/AssimpAPITest_aiMatrix3x3.cpp +++ b/test/unit/AssimpAPITest_aiMatrix3x3.cpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team - - +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -42,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "UnitTestPCH.h" #include "MathTest.h" +#include <array> using namespace Assimp; @@ -158,3 +157,18 @@ TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromToTest) { aiMatrix3FromTo(&result_c, &from, &to); EXPECT_EQ(result_cpp, result_c); } + +TEST_F(AssimpAPITest_aiMatrix3x3, operatorTest) { + std::array<ai_real, 9> value = { 1, 2, 3, 4, 5, 6, 7, 8,9}; + result_cpp = aiMatrix3x3( value[0], value[1], value[2], value[3], + value[4], value[5], value[6], value[7], + value[8]); + size_t idx=0; + for (unsigned int i = 0; i < 3; ++i) { + for (unsigned int j = 0; j < 3; ++j) { + ai_real curValue = result_cpp[i][j]; + EXPECT_EQ(curValue, value[idx]); + idx++; + } + } +} diff --git a/test/unit/AssimpAPITest_aiMatrix4x4.cpp b/test/unit/AssimpAPITest_aiMatrix4x4.cpp index d57026348..403072182 100644 --- a/test/unit/AssimpAPITest_aiMatrix4x4.cpp +++ b/test/unit/AssimpAPITest_aiMatrix4x4.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -41,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "UnitTestPCH.h" #include "MathTest.h" #include <assimp/MathFunctions.h> +#include <array> using namespace Assimp; @@ -262,3 +263,20 @@ TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromToTest) { aiMatrix4FromTo(&result_c, &from, &to); EXPECT_EQ(result_cpp, result_c); } + +TEST_F(AssimpAPITest_aiMatrix4x4, operatorTest) { + std::array<ai_real, 16> value = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + result_cpp = aiMatrix4x4( value[0], value[1], value[2], value[3], + value[4], value[5], value[6], value[7], + value[8], value[9], value[10], value[11], + value[12], value[13], value[14], value[15] ); + size_t idx=0; + for (unsigned int i = 0; i < 4; ++i) { + for (unsigned int j = 0; j < 4; ++j) { + ai_real curValue = result_cpp[i][j]; + EXPECT_EQ(curValue, value[idx]); + idx++; + } + } +} diff --git a/test/unit/AssimpAPITest_aiQuaternion.cpp b/test/unit/AssimpAPITest_aiQuaternion.cpp index fe28bc9d0..b9766eb68 100644 --- a/test/unit/AssimpAPITest_aiQuaternion.cpp +++ b/test/unit/AssimpAPITest_aiQuaternion.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/AssimpAPITest_aiVector2D.cpp b/test/unit/AssimpAPITest_aiVector2D.cpp index 8831016cd..14755415e 100644 --- a/test/unit/AssimpAPITest_aiVector2D.cpp +++ b/test/unit/AssimpAPITest_aiVector2D.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/AssimpAPITest_aiVector3D.cpp b/test/unit/AssimpAPITest_aiVector3D.cpp index 67ad11bb6..cbe230306 100644 --- a/test/unit/AssimpAPITest_aiVector3D.cpp +++ b/test/unit/AssimpAPITest_aiVector3D.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp index 5002b5dd8..d0de43b0f 100644 --- a/test/unit/Common/uiScene.cpp +++ b/test/unit/Common/uiScene.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utAssertHandler.cpp b/test/unit/Common/utAssertHandler.cpp index 53bf5c929..8f3cc42c7 100644 --- a/test/unit/Common/utAssertHandler.cpp +++ b/test/unit/Common/utAssertHandler.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utBase64.cpp b/test/unit/Common/utBase64.cpp index 910a908cb..53dd864ec 100644 --- a/test/unit/Common/utBase64.cpp +++ b/test/unit/Common/utBase64.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utBaseProcess.cpp b/test/unit/Common/utBaseProcess.cpp index f70dae07b..a620c7970 100644 --- a/test/unit/Common/utBaseProcess.cpp +++ b/test/unit/Common/utBaseProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utHash.cpp b/test/unit/Common/utHash.cpp index 912aca11d..668994baa 100644 --- a/test/unit/Common/utHash.cpp +++ b/test/unit/Common/utHash.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utLineSplitter.cpp b/test/unit/Common/utLineSplitter.cpp index f62a00c74..2320ea599 100644 --- a/test/unit/Common/utLineSplitter.cpp +++ b/test/unit/Common/utLineSplitter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/Common/utLogger.cpp b/test/unit/Common/utLogger.cpp new file mode 100644 index 000000000..a72f2d48e --- /dev/null +++ b/test/unit/Common/utLogger.cpp @@ -0,0 +1,52 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2025, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include "UnitTestPCH.h" +#include <assimp/Importer.hpp> + +using namespace Assimp; +class utLogger : public ::testing::Test {}; + +TEST_F(utLogger, aiGetPredefinedLogStream_leak_test) { + aiLogStream stream1 = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT, nullptr); + aiLogStream stream2 = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT, nullptr); + ASSERT_EQ(stream1.callback, stream2.callback); +} diff --git a/test/unit/Common/utMaybe.cpp b/test/unit/Common/utMaybe.cpp index c66b8f603..b50205339 100644 --- a/test/unit/Common/utMaybe.cpp +++ b/test/unit/Common/utMaybe.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utMesh.cpp b/test/unit/Common/utMesh.cpp index 7baaa92a0..a93b05d80 100644 --- a/test/unit/Common/utMesh.cpp +++ b/test/unit/Common/utMesh.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utParsingUtils.cpp b/test/unit/Common/utParsingUtils.cpp new file mode 100644 index 000000000..f7e36ffcb --- /dev/null +++ b/test/unit/Common/utParsingUtils.cpp @@ -0,0 +1,66 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2025, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include "UnitTestPCH.h" +#include <assimp/ParsingUtils.h> +#include <assimp/fast_atof.h> +#include <array> + +using namespace Assimp; + +class utParsingUtils : public ::testing::Test {}; + +TEST_F(utParsingUtils, parseFloatsStringTest) { + const std::array<float, 16> floatArray = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 7.54979e-8f, -1.0f, 0.0f, + 0.0f, 1.0f, 7.54979e-8f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + const std::string floatArrayAsStr = "1 0 0 0 0 7.54979e-8 -1 0 0 1 7.54979e-8 0 0 0 0 1"; + const char *content = floatArrayAsStr.c_str(); + const char *end = content + floatArrayAsStr.size(); + for (float i : floatArray) { + float value = 0.0f; + SkipSpacesAndLineEnd(&content, end); + content = fast_atoreal_move(content, value); + EXPECT_FLOAT_EQ(value, i); + } +} diff --git a/test/unit/Common/utSpatialSort.cpp b/test/unit/Common/utSpatialSort.cpp index a75daebce..4cbe2aa91 100644 --- a/test/unit/Common/utSpatialSort.cpp +++ b/test/unit/Common/utSpatialSort.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp index e1843d6c5..d8597d3eb 100644 --- a/test/unit/Common/utStandardShapes.cpp +++ b/test/unit/Common/utStandardShapes.cpp @@ -1,7 +1,7 @@ /* Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the diff --git a/test/unit/Common/utXmlParser.cpp b/test/unit/Common/utXmlParser.cpp index b566aa381..a06712767 100644 --- a/test/unit/Common/utXmlParser.cpp +++ b/test/unit/Common/utXmlParser.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Geometry/utGeometryUtils.cpp b/test/unit/Geometry/utGeometryUtils.cpp index 345946132..292bcb5d9 100644 --- a/test/unit/Geometry/utGeometryUtils.cpp +++ b/test/unit/Geometry/utGeometryUtils.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h index 0fff3411e..187a0e307 100644 --- a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h +++ b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp index f6e03cb09..17c2ac6a4 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp index d0345e3e4..140bbdf5d 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index 1029a6138..f361a1005 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/RAW/utRAWImportExport.cpp b/test/unit/ImportExport/RAW/utRAWImportExport.cpp index 9981ed2f7..01734e076 100644 --- a/test/unit/ImportExport/RAW/utRAWImportExport.cpp +++ b/test/unit/ImportExport/RAW/utRAWImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp index 1ddde44a6..f6b85af90 100644 --- a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp +++ b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utAssjsonImportExport.cpp b/test/unit/ImportExport/utAssjsonImportExport.cpp index c32b0f160..bec77b79d 100644 --- a/test/unit/ImportExport/utAssjsonImportExport.cpp +++ b/test/unit/ImportExport/utAssjsonImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -57,18 +57,29 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure); Exporter exporter; - aiReturn res = exporter.Export(scene, "assjson", "./spider_test.json"); + const char *testFileName = "./spider_test.json"; + aiReturn res = exporter.Export(scene, "assjson", testFileName); if (aiReturn_SUCCESS != res) { return false; } Assimp::ExportProperties exportProperties; exportProperties.SetPropertyBool("JSON_SKIP_WHITESPACES", true); - aiReturn resNoWhitespace = exporter.Export(scene, "assjson", "./spider_test_nowhitespace.json", 0u, &exportProperties); + const char *testNoWhitespaceFileName = "./spider_test_nowhitespace.json"; + aiReturn resNoWhitespace = exporter.Export(scene, "assjson", testNoWhitespaceFileName, 0u, &exportProperties); if (aiReturn_SUCCESS != resNoWhitespace) { return false; } + // Cleanup, remove generated json + if (0 != std::remove(testFileName)) { + return false; + } + + if (0 != std::remove(testNoWhitespaceFileName)) { + return false; + } + return true; } }; diff --git a/test/unit/ImportExport/utCOBImportExport.cpp b/test/unit/ImportExport/utCOBImportExport.cpp index 705cda38d..05a8e3e91 100644 --- a/test/unit/ImportExport/utCOBImportExport.cpp +++ b/test/unit/ImportExport/utCOBImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -63,9 +63,7 @@ TEST(utCOBImporter, importDwarf) { TEST(utCOBImporter, importMoleculeASCII) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/molecule_ascii.cob", aiProcess_ValidateDataStructure); - // FIXME: this is wrong, it should succeed - // change to ASSERT_NE after it's been fixed - ASSERT_EQ(nullptr, scene); + ASSERT_NE(nullptr, scene); } TEST(utCOBImporter, importMolecule) { diff --git a/test/unit/ImportExport/utExporter.cpp b/test/unit/ImportExport/utExporter.cpp index d94f179ed..607a38189 100644 --- a/test/unit/ImportExport/utExporter.cpp +++ b/test/unit/ImportExport/utExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMD2Importer.cpp b/test/unit/ImportExport/utMD2Importer.cpp index 975b8f641..6fd9428ff 100644 --- a/test/unit/ImportExport/utMD2Importer.cpp +++ b/test/unit/ImportExport/utMD2Importer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMD5Importer.cpp b/test/unit/ImportExport/utMD5Importer.cpp index 6fe558565..4af416de9 100644 --- a/test/unit/ImportExport/utMD5Importer.cpp +++ b/test/unit/ImportExport/utMD5Importer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMDLImporter.cpp b/test/unit/ImportExport/utMDLImporter.cpp index 43cdf9a1d..ec8480d99 100644 --- a/test/unit/ImportExport/utMDLImporter.cpp +++ b/test/unit/ImportExport/utMDLImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utNFFImportExport.cpp b/test/unit/ImportExport/utNFFImportExport.cpp index b989578f5..411b49982 100644 --- a/test/unit/ImportExport/utNFFImportExport.cpp +++ b/test/unit/ImportExport/utNFFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -50,7 +50,7 @@ class utNFFImportExport : public AbstractImportExportBase { public: virtual bool importerTest() { Assimp::Importer importer; - const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/NFF/ManyEarthsNotJustOne.nff", 0); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/ManyEarthsNotJustOne.nff", 0); return nullptr != scene; } }; diff --git a/test/unit/ImportExport/utOFFImportExport.cpp b/test/unit/ImportExport/utOFFImportExport.cpp index abd1fe154..90e050c73 100644 --- a/test/unit/ImportExport/utOFFImportExport.cpp +++ b/test/unit/ImportExport/utOFFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utOgreImportExport.cpp b/test/unit/ImportExport/utOgreImportExport.cpp index d3234c036..37ff98c48 100644 --- a/test/unit/ImportExport/utOgreImportExport.cpp +++ b/test/unit/ImportExport/utOgreImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp index d8738eff7..728d934da 100644 --- a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp +++ b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utXGLImportExport.cpp b/test/unit/ImportExport/utXGLImportExport.cpp index 080290e1d..616e3be5d 100644 --- a/test/unit/ImportExport/utXGLImportExport.cpp +++ b/test/unit/ImportExport/utXGLImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/Main.cpp b/test/unit/Main.cpp index 573c26a96..48022be0c 100644 --- a/test/unit/Main.cpp +++ b/test/unit/Main.cpp @@ -1,7 +1,6 @@ #include "../../include/assimp/DefaultLogger.hpp" #include "UnitTestPCH.h" -#include <math.h> -#include <time.h> +#include <ctime> int main(int argc, char *argv[]) { ::testing::InitGoogleTest(&argc, argv); @@ -14,12 +13,12 @@ int main(int argc, char *argv[]) { // ............................................................................ // create a logger from both CPP - Assimp::DefaultLogger::create("AssimpLog_Cpp.txt", Assimp::Logger::VERBOSE, + Assimp::DefaultLogger::create("AssimpLog_Cpp.log", Assimp::Logger::VERBOSE, aiDefaultLogStream_STDOUT | aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE); // .. and C. They should smoothly work together aiEnableVerboseLogging(AI_TRUE); - aiLogStream logstream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.txt"); + aiLogStream logstream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.log"); aiAttachLogStream(&logstream); int result = RUN_ALL_TESTS(); diff --git a/test/unit/MathTest.cpp b/test/unit/MathTest.cpp index 6069df22e..1091036eb 100644 --- a/test/unit/MathTest.cpp +++ b/test/unit/MathTest.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/MathTest.h b/test/unit/MathTest.h index a09024370..896805f8b 100644 --- a/test/unit/MathTest.h +++ b/test/unit/MathTest.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/RandomNumberGeneration.h b/test/unit/RandomNumberGeneration.h index 0383332e4..e5d1fd9b6 100644 --- a/test/unit/RandomNumberGeneration.h +++ b/test/unit/RandomNumberGeneration.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/SceneDiffer.cpp b/test/unit/SceneDiffer.cpp index 6cbc33dde..d558e9805 100644 --- a/test/unit/SceneDiffer.cpp +++ b/test/unit/SceneDiffer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/SceneDiffer.h b/test/unit/SceneDiffer.h index 06065bd5f..2fd6c6376 100644 --- a/test/unit/SceneDiffer.h +++ b/test/unit/SceneDiffer.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/TestIOSystem.h b/test/unit/TestIOSystem.h index 8791f9b92..60459ba5f 100644 --- a/test/unit/TestIOSystem.h +++ b/test/unit/TestIOSystem.h @@ -3,8 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team - +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/TestModelFactory.h b/test/unit/TestModelFactory.h index 2ddf37e3e..1dfda4f88 100644 --- a/test/unit/TestModelFactory.h +++ b/test/unit/TestModelFactory.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team - - +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -49,18 +47,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -class TestModelFacttory { +class TestModelFactory { public: - TestModelFacttory() { - // empty - } + TestModelFactory() = default; - ~TestModelFacttory() { - // empty - } + ~TestModelFactory() = default; static aiScene *createDefaultTestModel( float &opacity ) { - aiScene *scene( new aiScene ); + auto *scene = new aiScene; scene->mNumMaterials = 1; scene->mMaterials = new aiMaterial*[scene->mNumMaterials]; scene->mMaterials[ 0 ] = new aiMaterial; @@ -89,7 +83,7 @@ public: scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 1 ] = 1; scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 2 ] = 2; - scene->mRootNode = new aiNode(); + scene->mRootNode = new aiNode; scene->mRootNode->mNumMeshes = 1; scene->mRootNode->mMeshes = new unsigned int[1]{ 0 }; diff --git a/test/unit/UTLogStream.h b/test/unit/UTLogStream.h index d35de8bdc..76171a706 100644 --- a/test/unit/UTLogStream.h +++ b/test/unit/UTLogStream.h @@ -3,8 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team - +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp index 4cd538c46..fe83bd8d9 100644 --- a/test/unit/ut3DImportExport.cpp +++ b/test/unit/ut3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp index a2da3607c..6de78c0f3 100644 --- a/test/unit/ut3DSImportExport.cpp +++ b/test/unit/ut3DSImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp index 4fdb68651..c3c0e4506 100644 --- a/test/unit/utACImportExport.cpp +++ b/test/unit/utACImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp index 996614572..4fca9bd14 100644 --- a/test/unit/utAMFImportExport.cpp +++ b/test/unit/utAMFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp index e2d1bfa59..690a1fe4e 100644 --- a/test/unit/utASEImportExport.cpp +++ b/test/unit/utASEImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utAnim.cpp b/test/unit/utAnim.cpp index 613f7f03b..4075ebb7d 100644 --- a/test/unit/utAnim.cpp +++ b/test/unit/utAnim.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utArmaturePopulate.cpp b/test/unit/utArmaturePopulate.cpp index 9f4545c6a..493445e6f 100644 --- a/test/unit/utArmaturePopulate.cpp +++ b/test/unit/utArmaturePopulate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utAssbinImportExport.cpp b/test/unit/utAssbinImportExport.cpp index 5eb2f56bd..3b24b3225 100644 --- a/test/unit/utAssbinImportExport.cpp +++ b/test/unit/utAssbinImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utB3DImportExport.cpp b/test/unit/utB3DImportExport.cpp index e84313ad8..b549d66e3 100644 --- a/test/unit/utB3DImportExport.cpp +++ b/test/unit/utB3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utBVHImportExport.cpp b/test/unit/utBVHImportExport.cpp index 94636c7bf..5d5b0c488 100644 --- a/test/unit/utBVHImportExport.cpp +++ b/test/unit/utBVHImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utBatchLoader.cpp b/test/unit/utBatchLoader.cpp index be1ac30ad..2552802e2 100644 --- a/test/unit/utBatchLoader.cpp +++ b/test/unit/utBatchLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utBlendImportAreaLight.cpp b/test/unit/utBlendImportAreaLight.cpp index cc6e1e1a0..bc9e4af2b 100644 --- a/test/unit/utBlendImportAreaLight.cpp +++ b/test/unit/utBlendImportAreaLight.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utBlendImportMaterials.cpp b/test/unit/utBlendImportMaterials.cpp index 416fb3236..f38f8c039 100644 --- a/test/unit/utBlendImportMaterials.cpp +++ b/test/unit/utBlendImportMaterials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utBlenderImportExport.cpp b/test/unit/utBlenderImportExport.cpp index 0eda7b661..eeaf1cd37 100644 --- a/test/unit/utBlenderImportExport.cpp +++ b/test/unit/utBlenderImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utBlenderIntermediate.cpp b/test/unit/utBlenderIntermediate.cpp index b76c48b44..c9b4c2057 100644 --- a/test/unit/utBlenderIntermediate.cpp +++ b/test/unit/utBlenderIntermediate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utBlenderWork.cpp b/test/unit/utBlenderWork.cpp index 2ba6329ca..3773251e6 100644 --- a/test/unit/utBlenderWork.cpp +++ b/test/unit/utBlenderWork.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utCSMImportExport.cpp b/test/unit/utCSMImportExport.cpp index 8ef14e282..c4b4e5d4c 100644 --- a/test/unit/utCSMImportExport.cpp +++ b/test/unit/utCSMImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utColladaExport.cpp b/test/unit/utColladaExport.cpp index e0a62b338..d7f450b7b 100644 --- a/test/unit/utColladaExport.cpp +++ b/test/unit/utColladaExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -79,7 +79,7 @@ TEST_F(utColladaExport, testExportCamera) { EXPECT_EQ(AI_SUCCESS, ex->Export(pTest, "collada", file)); const unsigned int origNumCams(pTest->mNumCameras); - //std::vector<float> origFOV; + std::unique_ptr<float[]> origFOV(new float[origNumCams]); std::unique_ptr<float[]> orifClipPlaneNear(new float[origNumCams]); std::unique_ptr<float[]> orifClipPlaneFar(new float[origNumCams]); @@ -114,6 +114,9 @@ TEST_F(utColladaExport, testExportCamera) { EXPECT_FLOAT_EQ(pos[i].y, read->mPosition.y); EXPECT_FLOAT_EQ(pos[i].z, read->mPosition.z); } + + // Cleanup, delete the exported file + EXPECT_EQ(0, std::remove(file)); } // ------------------------------------------------------------------------------------------------ @@ -220,6 +223,9 @@ TEST_F(utColladaExport, testExportLight) { EXPECT_NEAR(orig->mAngleInnerCone, read->mAngleInnerCone, 0.001); EXPECT_NEAR(orig->mAngleOuterCone, read->mAngleOuterCone, 0.001); } + + // Cleanup, delete the exported file + EXPECT_EQ(0, std::remove(file)); } #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp index 4e92c6930..a508be5c9 100644 --- a/test/unit/utColladaImportExport.cpp +++ b/test/unit/utColladaImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utD3MFImportExport.cpp b/test/unit/utD3MFImportExport.cpp index 77655c0ad..d924086a7 100644 --- a/test/unit/utD3MFImportExport.cpp +++ b/test/unit/utD3MFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp index ee0c57db6..80852ae4e 100644 --- a/test/unit/utDXFImporterExporter.cpp +++ b/test/unit/utDXFImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utDefaultIOStream.cpp b/test/unit/utDefaultIOStream.cpp index 2a2d7a894..b9707fb16 100644 --- a/test/unit/utDefaultIOStream.cpp +++ b/test/unit/utDefaultIOStream.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utExport.cpp b/test/unit/utExport.cpp index ebb664fa4..d4cff6610 100644 --- a/test/unit/utExport.cpp +++ b/test/unit/utExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 5cc40d216..6f4c8285f 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -311,6 +311,37 @@ TEST_F(utFBXImporterExporter, sceneMetadata) { } } +TEST_F(utFBXImporterExporter, importCustomAxes) { + // see https://github.com/assimp/assimp/issues/5494 + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + + // The ASCII box has customised the Up and Forward axes, verify that the RootNode transform has applied it + ASSERT_FALSE(scene->mRootNode->mTransformation.IsIdentity()) << "Did not apply the custom axis transform"; + + aiVector3D upVec{ 0, 0, 1 }; // Up is +Z + aiVector3D forwardVec{ 0, -1, 0 }; // Forward is -Y + aiVector3D rightVec{ 1, 0, 0 }; // Right is +X + aiMatrix4x4 mat(rightVec.x, rightVec.y, rightVec.z, 0.0f, + upVec.x, upVec.y, upVec.z, 0.0f, + forwardVec.x, forwardVec.y, forwardVec.z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); + + EXPECT_EQ(mat, scene->mRootNode->mTransformation); +} + +TEST_F(utFBXImporterExporter, importIgnoreCustomAxes) { + // see https://github.com/assimp/assimp/issues/5494 + Assimp::Importer importer; + importer.SetPropertyBool(AI_CONFIG_IMPORT_FBX_IGNORE_UP_DIRECTION, true); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + + // Verify that the RootNode transform has NOT applied the custom axes + EXPECT_TRUE(scene->mRootNode->mTransformation.IsIdentity()); +} + TEST_F(utFBXImporterExporter, importCubesWithOutOfRangeFloat) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_with_outofrange_float.fbx", aiProcess_ValidateDataStructure); diff --git a/test/unit/utFastAtof.cpp b/test/unit/utFastAtof.cpp index 50c26ca03..3c34565fb 100644 --- a/test/unit/utFastAtof.cpp +++ b/test/unit/utFastAtof.cpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team - - +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -122,6 +120,7 @@ protected: TEST_CASE(0e-19); TEST_CASE(400012); TEST_CASE(5.9e-76); + TEST_CASE(7.54979e-8); TEST_CASE_INF(inf); TEST_CASE_INF(inf); TEST_CASE_INF(infinity); diff --git a/test/unit/utFindDegenerates.cpp b/test/unit/utFindDegenerates.cpp index 405c35230..6325ed740 100644 --- a/test/unit/utFindDegenerates.cpp +++ b/test/unit/utFindDegenerates.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utFindInvalidData.cpp b/test/unit/utFindInvalidData.cpp index ab845b35e..0c931787a 100644 --- a/test/unit/utFindInvalidData.cpp +++ b/test/unit/utFindInvalidData.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utFixInfacingNormals.cpp b/test/unit/utFixInfacingNormals.cpp index 54fef7b59..54d822822 100644 --- a/test/unit/utFixInfacingNormals.cpp +++ b/test/unit/utFixInfacingNormals.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utGenBoundingBoxesProcess.cpp b/test/unit/utGenBoundingBoxesProcess.cpp index 18b15c31e..f7d130055 100644 --- a/test/unit/utGenBoundingBoxesProcess.cpp +++ b/test/unit/utGenBoundingBoxesProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utGenNormals.cpp b/test/unit/utGenNormals.cpp index 4a1db0216..baa056cf9 100644 --- a/test/unit/utGenNormals.cpp +++ b/test/unit/utGenNormals.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utHMPImportExport.cpp b/test/unit/utHMPImportExport.cpp index 8171bb26a..1ae18b7a9 100644 --- a/test/unit/utHMPImportExport.cpp +++ b/test/unit/utHMPImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utIFCImportExport.cpp b/test/unit/utIFCImportExport.cpp index 06009be2b..30698dda6 100644 --- a/test/unit/utIFCImportExport.cpp +++ b/test/unit/utIFCImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utIOStreamBuffer.cpp b/test/unit/utIOStreamBuffer.cpp index 381716040..ddd4bf98f 100644 --- a/test/unit/utIOStreamBuffer.cpp +++ b/test/unit/utIOStreamBuffer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utIOSystem.cpp b/test/unit/utIOSystem.cpp index 5bc9996b0..0e537d11a 100644 --- a/test/unit/utIOSystem.cpp +++ b/test/unit/utIOSystem.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 2470283c0..ca482faa9 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -299,7 +299,7 @@ aiImporterDesc s_failingImporterDescription = { class FailingImporter : public Assimp::BaseImporter { public: virtual ~FailingImporter() = default; - virtual bool CanRead(const std::string &, Assimp::IOSystem *, bool) const override { + bool CanRead(const std::string &, Assimp::IOSystem *, bool) const override { return true; } diff --git a/test/unit/utImproveCacheLocality.cpp b/test/unit/utImproveCacheLocality.cpp index 269721eda..1349ecf1b 100644 --- a/test/unit/utImproveCacheLocality.cpp +++ b/test/unit/utImproveCacheLocality.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utIssues.cpp b/test/unit/utIssues.cpp index 2611ffdb9..0bf9956b6 100644 --- a/test/unit/utIssues.cpp +++ b/test/unit/utIssues.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -55,7 +55,7 @@ class utIssues : public ::testing::Test {}; TEST_F( utIssues, OpacityBugWhenExporting_727 ) { float opacity; - aiScene *scene = TestModelFacttory::createDefaultTestModel(opacity); + aiScene *scene = TestModelFactory::createDefaultTestModel(opacity); Assimp::Importer importer; Assimp::Exporter exporter; @@ -69,11 +69,15 @@ TEST_F( utIssues, OpacityBugWhenExporting_727 ) { const aiScene *newScene( importer.ReadFile( path, aiProcess_ValidateDataStructure ) ); ASSERT_NE( nullptr, newScene ); float newOpacity; - if ( newScene->mNumMaterials > 0 ) { + if (newScene->mNumMaterials > 0 ) { EXPECT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) ); EXPECT_FLOAT_EQ( opacity, newOpacity ); } - delete scene; + + TestModelFactory::releaseDefaultTestModel(&scene); + + // Cleanup. Delete exported dae.dae file + EXPECT_EQ(0, std::remove(path.c_str())); } #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/test/unit/utJoinVertices.cpp b/test/unit/utJoinVertices.cpp index 9dbe87536..a2fa3a253 100644 --- a/test/unit/utJoinVertices.cpp +++ b/test/unit/utJoinVertices.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utLWOImportExport.cpp b/test/unit/utLWOImportExport.cpp index 78572a7db..30e7a64ee 100644 --- a/test/unit/utLWOImportExport.cpp +++ b/test/unit/utLWOImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utLWSImportExport.cpp b/test/unit/utLWSImportExport.cpp index 3f9c62361..73a6bc76b 100644 --- a/test/unit/utLWSImportExport.cpp +++ b/test/unit/utLWSImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utLimitBoneWeights.cpp b/test/unit/utLimitBoneWeights.cpp index 5a543aa2b..ffaaa53cb 100644 --- a/test/unit/utLimitBoneWeights.cpp +++ b/test/unit/utLimitBoneWeights.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utMDCImportExport.cpp b/test/unit/utMDCImportExport.cpp index d5b8dee0b..e72186a70 100644 --- a/test/unit/utMDCImportExport.cpp +++ b/test/unit/utMDCImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp index 4d335a979..fb664e419 100644 --- a/test/unit/utMaterialSystem.cpp +++ b/test/unit/utMaterialSystem.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -260,13 +260,15 @@ TEST_F(MaterialSystemTest, testMaterialTextureTypeEnum) { case aiTextureType_METALNESS: case aiTextureType_DIFFUSE_ROUGHNESS: case aiTextureType_AMBIENT_OCCLUSION: + case aiTextureType_SHEEN: + case aiTextureType_CLEARCOAT: + case aiTextureType_TRANSMISSION: case aiTextureType_MAYA_BASE: case aiTextureType_MAYA_SPECULAR: case aiTextureType_MAYA_SPECULAR_COLOR: case aiTextureType_MAYA_SPECULAR_ROUGHNESS: - case aiTextureType_SHEEN: - case aiTextureType_CLEARCOAT: - case aiTextureType_TRANSMISSION: + case aiTextureType_ANISOTROPY: + case aiTextureType_GLTF_METALLIC_ROUGHNESS: case aiTextureType_UNKNOWN: if (i > maxTextureType) maxTextureType = i; diff --git a/test/unit/utMatrix3x3.cpp b/test/unit/utMatrix3x3.cpp index 54bbece7d..d8b1b2757 100644 --- a/test/unit/utMatrix3x3.cpp +++ b/test/unit/utMatrix3x3.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utMatrix4x4.cpp b/test/unit/utMatrix4x4.cpp index 510900e82..7826d66db 100644 --- a/test/unit/utMatrix4x4.cpp +++ b/test/unit/utMatrix4x4.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp index 76afd52ef..123bc5a1f 100644 --- a/test/unit/utMetadata.cpp +++ b/test/unit/utMetadata.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -229,7 +229,7 @@ TEST_F( utMetadata, copy_test ) { // bool test { - bool v; + bool v = true; EXPECT_TRUE( copy.Get( "bool", v ) ); EXPECT_EQ( bv, v ); } diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 8e9b4e633..16723df9b 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -525,3 +525,17 @@ TEST_F(utObjImportExport, import_with_line_continuations) { EXPECT_NEAR(vertices[2].y, 0.5f, threshold); EXPECT_NEAR(vertices[2].z, -0.5f, threshold); } + +TEST_F(utObjImportExport, issue2355_mtl_texture_prefix) { + ::Assimp::Importer importer; + const aiScene *const scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/mtl_different_folder.obj", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + + EXPECT_EQ(scene->mNumMaterials, 2U); + const aiMaterial *const material = scene->mMaterials[1]; + + aiString texturePath; + material->GetTexture(aiTextureType_DIFFUSE, 0, &texturePath); + // The MTL file is in `folder`, the image path should have been prefixed with the folder + EXPECT_STREQ("folder/image.jpg", texturePath.C_Str()); +} diff --git a/test/unit/utObjTools.cpp b/test/unit/utObjTools.cpp index f1437ff32..019d7da94 100644 --- a/test/unit/utObjTools.cpp +++ b/test/unit/utObjTools.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utOpenGEXImportExport.cpp b/test/unit/utOpenGEXImportExport.cpp index 51da9e237..dd3821ab0 100644 --- a/test/unit/utOpenGEXImportExport.cpp +++ b/test/unit/utOpenGEXImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index 54d7e4328..630d38d35 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -89,7 +89,7 @@ TEST_F(utPLYImportExport, exportTest_Success) { #endif // ASSIMP_BUILD_NO_EXPORT -//Test issue 1623, crash when loading two PLY files in a row +// Test issue 1623, crash when loading two PLY files in a row TEST_F(utPLYImportExport, importerMultipleTest) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure); @@ -109,7 +109,7 @@ TEST_F(utPLYImportExport, importPLYwithUV) { EXPECT_NE(nullptr, scene); EXPECT_NE(nullptr, scene->mMeshes[0]); - //This test model is using n-gons, so 6 faces instead of 12 tris + // This test model is using n-gons, so 6 faces instead of 12 tris EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces); EXPECT_EQ(aiPrimitiveType_POLYGON, scene->mMeshes[0]->mPrimitiveTypes); EXPECT_EQ(true, scene->mMeshes[0]->HasTextureCoords(0)); @@ -121,7 +121,7 @@ TEST_F(utPLYImportExport, importBinaryPLY) { EXPECT_NE(nullptr, scene); EXPECT_NE(nullptr, scene->mMeshes[0]); - //This test model is double sided, so 12 faces instead of 6 + // This test model is double sided, so 12 faces instead of 6 EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces); } @@ -141,6 +141,27 @@ TEST_F(utPLYImportExport, importBinaryPLYWithRNNewline) { EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]); } +// Tests of a PLY file gets read with \n as the fist character in the BINARY part +TEST_F(utPLYImportExport, importBinaryPLYWithNewlineInBinary) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary_starts_with_nl.ply", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMeshes[0]); + ASSERT_EQ(8u, scene->mMeshes[0]->mNumVertices); + // Make sure the first binary float was read correctly + ASSERT_FLOAT_EQ(5.967534f, scene->mMeshes[0]->mVertices[0][0]); + ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][1]); + ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][2]); + + ASSERT_EQ(6u, scene->mMeshes[0]->mNumFaces); + // Also check if the indices were parsed correctly + ASSERT_EQ(4u, scene->mMeshes[0]->mFaces[0].mNumIndices); + EXPECT_EQ(0u, scene->mMeshes[0]->mFaces[0].mIndices[0]); + EXPECT_EQ(1u, scene->mMeshes[0]->mFaces[0].mIndices[1]); + EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]); +} + TEST_F(utPLYImportExport, vertexColorTest) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure); @@ -160,7 +181,7 @@ TEST_F(utPLYImportExport, vertexColorTest) { TEST_F(utPLYImportExport, pointcloudTest) { Assimp::Importer importer; - //Could not use aiProcess_ValidateDataStructure since it's missing faces. + // Could not use aiProcess_ValidateDataStructure since it's missing faces. const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/issue623.ply", 0); EXPECT_NE(nullptr, scene); @@ -192,7 +213,7 @@ static const char *test_file = TEST_F(utPLYImportExport, parseErrorTest) { Assimp::Importer importer; - //Could not use aiProcess_ValidateDataStructure since it's missing faces. + // Could not use aiProcess_ValidateDataStructure since it's missing faces. const aiScene *scene = importer.ReadFileFromMemory(test_file, strlen(test_file), 0); EXPECT_NE(nullptr, scene); } @@ -207,5 +228,57 @@ TEST_F(utPLYImportExport, parseInvalid) { TEST_F(utPLYImportExport, payload_JVN42386607) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/payload_JVN42386607", 0); - EXPECT_EQ(nullptr, scene); -}
\ No newline at end of file + EXPECT_EQ(nullptr, scene); +} + +// Tests Issue #5729. Test, if properties defined multiple times. Unclear what to do, better to abort than to crash entirely +TEST_F(utPLYImportExport, parseInvalidDoubleProperty) { + const char data[] = "ply\n" + "format ascii 1.0\n" + "element vertex 4\n" + "property float x\n" + "property float y\n" + "property float z\n" + "element vertex 8\n" + "property float x\n" + "property float y\n" + "property float z\n" + "end_header\n" + "0.0 0.0 0.0 0.0 0.0 0.0\n" + "0.0 0.0 1.0 0.0 0.0 1.0\n" + "0.0 1.0 0.0 0.0 1.0 0.0\n" + "0.0 0.0 1.0\n" + "0.0 1.0 0.0 0.0 0.0 1.0\n" + "0.0 1.0 1.0 0.0 1.0 1.0\n"; + + Assimp::Importer importer; + const aiScene *scene = importer.ReadFileFromMemory(data, sizeof(data), 0); + EXPECT_EQ(nullptr, scene); +} + +// Tests Issue #5729. Test, if properties defined multiple times. Unclear what to do, better to abort than to crash entirely +TEST_F(utPLYImportExport, parseInvalidDoubleCustomProperty) { + const char data[] = "ply\n" + "format ascii 1.0\n" + "element vertex 4\n" + "property float x\n" + "property float y\n" + "property float z\n" + "element name 8\n" + "property float x\n" + "element name 5\n" + "property float x\n" + "end_header\n" + "0.0 0.0 0.0 100.0 10.0\n" + "0.0 0.0 1.0 200.0 20.0\n" + "0.0 1.0 0.0 300.0 30.0\n" + "0.0 1.0 1.0 400.0 40.0\n" + "0.0 0.0 0.0 500.0 50.0\n" + "0.0 0.0 1.0 600.0 60.0\n" + "0.0 1.0 0.0 700.0 70.0\n" + "0.0 1.0 1.0 800.0 80.0\n"; + + Assimp::Importer importer; + const aiScene *scene = importer.ReadFileFromMemory(data, sizeof(data), 0); + EXPECT_EQ(nullptr, scene); +} diff --git a/test/unit/utPMXImporter.cpp b/test/unit/utPMXImporter.cpp index a5aba923b..4610296fb 100644 --- a/test/unit/utPMXImporter.cpp +++ b/test/unit/utPMXImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp index a7b21c893..9c6a5bbeb 100644 --- a/test/unit/utPretransformVertices.cpp +++ b/test/unit/utPretransformVertices.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utProfiler.cpp b/test/unit/utProfiler.cpp index a9a54a934..07026ea56 100644 --- a/test/unit/utProfiler.cpp +++ b/test/unit/utProfiler.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utQ3DImportExport.cpp b/test/unit/utQ3DImportExport.cpp index 4fb71bb69..d5a9e16a0 100644 --- a/test/unit/utQ3DImportExport.cpp +++ b/test/unit/utQ3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utRemoveComments.cpp b/test/unit/utRemoveComments.cpp index f101b7d9e..82d9178d1 100644 --- a/test/unit/utRemoveComments.cpp +++ b/test/unit/utRemoveComments.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utRemoveComponent.cpp b/test/unit/utRemoveComponent.cpp index 5fbfe612c..affff813f 100644 --- a/test/unit/utRemoveComponent.cpp +++ b/test/unit/utRemoveComponent.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utRemoveRedundantMaterials.cpp b/test/unit/utRemoveRedundantMaterials.cpp index 5c9983859..519181924 100644 --- a/test/unit/utRemoveRedundantMaterials.cpp +++ b/test/unit/utRemoveRedundantMaterials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utRemoveVCProcess.cpp b/test/unit/utRemoveVCProcess.cpp index fdb4049b9..548fd975a 100644 --- a/test/unit/utRemoveVCProcess.cpp +++ b/test/unit/utRemoveVCProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSIBImporter.cpp b/test/unit/utSIBImporter.cpp index e2deb85c2..dc5c9180b 100644 --- a/test/unit/utSIBImporter.cpp +++ b/test/unit/utSIBImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSMDImportExport.cpp b/test/unit/utSMDImportExport.cpp index 6e2bc08e7..131070f41 100644 --- a/test/unit/utSMDImportExport.cpp +++ b/test/unit/utSMDImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSTLImportExport.cpp b/test/unit/utSTLImportExport.cpp index 7e2c29168..11f5d0969 100644 --- a/test/unit/utSTLImportExport.cpp +++ b/test/unit/utSTLImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -106,10 +106,14 @@ TEST_F(utSTLImporterExporter, exporterTest) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure); Assimp::Exporter mAiExporter; - mAiExporter.Export(scene, "stl", "spiderExport.stl"); + const char *stlFileName = "spiderExport.stl"; + mAiExporter.Export(scene, "stl", stlFileName); - const aiScene *scene2 = importer.ReadFile("spiderExport.stl", aiProcess_ValidateDataStructure); + const aiScene *scene2 = importer.ReadFile(stlFileName, aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene2); + + // Cleanup, delete the exported file + std::remove(stlFileName); } TEST_F(utSTLImporterExporter, test_export_pointclouds) { @@ -162,8 +166,12 @@ TEST_F(utSTLImporterExporter, test_export_pointclouds) { Assimp::Exporter mAiExporter; ExportProperties *properties = new ExportProperties; properties->SetPropertyBool(AI_CONFIG_EXPORT_POINT_CLOUDS, true); - mAiExporter.Export(&scene, "stl", "testExport.stl", 0, properties); + const char *stlFileName = "testExport.stl"; + mAiExporter.Export(&scene, "stl", stlFileName, 0, properties); + + // Cleanup, delete the exported file + ::remove(stlFileName); delete properties; } diff --git a/test/unit/utScaleProcess.cpp b/test/unit/utScaleProcess.cpp index 5772d4883..5a1197998 100644 --- a/test/unit/utScaleProcess.cpp +++ b/test/unit/utScaleProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSceneCombiner.cpp b/test/unit/utSceneCombiner.cpp index 055b54f5b..be218c468 100644 --- a/test/unit/utSceneCombiner.cpp +++ b/test/unit/utSceneCombiner.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utScenePreprocessor.cpp b/test/unit/utScenePreprocessor.cpp index 5e3dd95ce..999b0c75c 100644 --- a/test/unit/utScenePreprocessor.cpp +++ b/test/unit/utScenePreprocessor.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSharedPPData.cpp b/test/unit/utSharedPPData.cpp index f70d352ff..5959c23c6 100644 --- a/test/unit/utSharedPPData.cpp +++ b/test/unit/utSharedPPData.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team diff --git a/test/unit/utSimd.cpp b/test/unit/utSimd.cpp index 3f073b475..d60258925 100644 --- a/test/unit/utSimd.cpp +++ b/test/unit/utSimd.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utSortByPType.cpp b/test/unit/utSortByPType.cpp index ff8b717ef..2c1ceca33 100644 --- a/test/unit/utSortByPType.cpp +++ b/test/unit/utSortByPType.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -43,6 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Common/ScenePreprocessor.h" #include "PostProcessing/SortByPTypeProcess.h" #include <assimp/scene.h> +#include <assimp/postprocess.h> using namespace std; using namespace Assimp; @@ -202,3 +203,9 @@ TEST_F(SortByPTypeProcessTest, SortByPTypeStep) { } } } + +TEST_F(SortByPTypeProcessTest, issue389327770Test) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888", aiProcessPreset_TargetRealtime_Fast); + EXPECT_NE(nullptr, scene); +} diff --git a/test/unit/utSplitLargeMeshes.cpp b/test/unit/utSplitLargeMeshes.cpp index b8bab7193..85b3a464b 100644 --- a/test/unit/utSplitLargeMeshes.cpp +++ b/test/unit/utSplitLargeMeshes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp index 7cb11797d..d6f4ca6ba 100644 --- a/test/unit/utStringUtils.cpp +++ b/test/unit/utStringUtils.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utTargetAnimation.cpp b/test/unit/utTargetAnimation.cpp index 2711e895c..a67495110 100644 --- a/test/unit/utTargetAnimation.cpp +++ b/test/unit/utTargetAnimation.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utTextureTransform.cpp b/test/unit/utTextureTransform.cpp index 2711e895c..a67495110 100644 --- a/test/unit/utTextureTransform.cpp +++ b/test/unit/utTextureTransform.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utTriangulate.cpp b/test/unit/utTriangulate.cpp index 2df0ce6cd..75821b5b8 100644 --- a/test/unit/utTriangulate.cpp +++ b/test/unit/utTriangulate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utTypes.cpp b/test/unit/utTypes.cpp index 45a4b5517..b5c91c2e9 100644 --- a/test/unit/utTypes.cpp +++ b/test/unit/utTypes.cpp @@ -1,11 +1,8 @@ /* --------------------------------------------------------------------------- Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2024, assimp team - +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utUSDImport.cpp b/test/unit/utUSDImport.cpp index 2f4ffeaf4..040e5d3aa 100644 --- a/test/unit/utUSDImport.cpp +++ b/test/unit/utUSDImport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -49,18 +49,42 @@ Copyright (c) 2006-2024, assimp team using namespace ::Assimp; class utUSDImport : public AbstractImportExportBase { -public: - virtual bool importerTest() { - Assimp::Importer importer; - const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/suzanne.usdc", aiProcess_ValidateDataStructure); - EXPECT_EQ(1u, scene->mNumMeshes); - EXPECT_NE(nullptr, scene->mMeshes[0]); - if (nullptr == scene->mMeshes[0]) { - return false; - } - EXPECT_EQ(507u, scene->mMeshes[0]->mNumVertices); - EXPECT_EQ(968u, scene->mMeshes[0]->mNumFaces); - - return (nullptr != scene); - } }; + +TEST_F(utUSDImport, meshTest) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usdc/suzanne.usdc", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + EXPECT_EQ(1u, scene->mNumMeshes); + EXPECT_NE(nullptr, scene->mMeshes[0]); + EXPECT_EQ(1968u, scene->mMeshes[0]->mNumVertices); // Note: suzanne is authored with only 507 vertices, but TinyUSDZ rebuilds the vertex array. see https://github.com/lighttransport/tinyusdz/blob/36f2aabb256b360365989c01a52f839a57dfe2a6/src/tydra/render-data.cc#L2673-L2690 + EXPECT_EQ(968u, scene->mMeshes[0]->mNumFaces); +} + +TEST_F(utUSDImport, skinnedMeshTest) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usda/simple-skin-test.usda", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + EXPECT_TRUE(scene->HasMeshes()); + + const aiMesh *mesh = scene->mMeshes[0]; + EXPECT_EQ(2, mesh->mNumBones); + + // Check bone names and make sure scene has nodes of the same name + EXPECT_EQ(mesh->mBones[0]->mName, aiString("Bone")); + EXPECT_EQ(mesh->mBones[1]->mName, aiString("Bone/Bone_001")); + + EXPECT_NE(nullptr, scene->mRootNode->FindNode("Bone")); + EXPECT_NE(nullptr, scene->mRootNode->FindNode("Bone/Bone_001")); +} + +TEST_F(utUSDImport, singleAnimationTest) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usda/simple-skin-animation-test.usda", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); + EXPECT_TRUE(scene->HasAnimations()); + EXPECT_EQ(2, scene->mAnimations[0]->mNumChannels); // 2 bones. 1 channel for each bone +} + +// Note: Add multi-animation test once supported by USD +// See https://github.com/lighttransport/tinyusdz/issues/122 for details. diff --git a/test/unit/utVector3.cpp b/test/unit/utVector3.cpp index f13521894..bdf41c6cf 100644 --- a/test/unit/utVector3.cpp +++ b/test/unit/utVector3.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utVersion.cpp b/test/unit/utVersion.cpp index 57a3a57db..078bfd7be 100644 --- a/test/unit/utVersion.cpp +++ b/test/unit/utVersion.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -48,20 +48,20 @@ TEST_F( utVersion, aiGetLegalStringTest ) { EXPECT_NE( lv, nullptr ); std::string text( lv ); - size_t pos = text.find(std::string("2024")); + size_t pos = text.find(std::string("2025")); EXPECT_NE(pos, std::string::npos); } TEST_F( utVersion, aiGetVersionMajorTest ) { - EXPECT_EQ( aiGetVersionMajor(), 5U ); + EXPECT_EQ( aiGetVersionMajor(), 6U ); } TEST_F( utVersion, aiGetVersionMinorTest ) { - EXPECT_EQ(aiGetVersionMinor(), 4U); + EXPECT_EQ(aiGetVersionMinor(), 0U); } TEST_F( utVersion, aiGetVersionPatchTest ) { - EXPECT_EQ(aiGetVersionPatch(), 3U ); + EXPECT_EQ(aiGetVersionPatch(), 2U ); } TEST_F( utVersion, aiGetCompileFlagsTest ) { diff --git a/test/unit/utVertexTriangleAdjacency.cpp b/test/unit/utVertexTriangleAdjacency.cpp index f5ad492ef..341241e07 100644 --- a/test/unit/utVertexTriangleAdjacency.cpp +++ b/test/unit/utVertexTriangleAdjacency.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utX3DImportExport.cpp b/test/unit/utX3DImportExport.cpp index b0b6802b9..e60e335ce 100644 --- a/test/unit/utX3DImportExport.cpp +++ b/test/unit/utX3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -73,3 +73,25 @@ TEST_F(utX3DImportExport, importX3DIndexedLineSet) { ASSERT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); } } + +TEST_F(utX3DImportExport, importX3DComputerKeyboard) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X3D/ComputerKeyboard.x3d", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); + // TODO: CHANGE INCORRECT VALUE WHEN IMPORTER FIXED + // As noted in assimp issue 4992, X3D importer was severely broken with 5 Oct 2020 commit 3b9d4cf. + // ComputerKeyboard.x3d should have 100 meshes but broken importer only has 4 + ASSERT_EQ(4u, scene->mNumMeshes); // Incorrect value from currently broken importer + ASSERT_NE(100u, scene->mNumMeshes); // Correct value, to be restored when importer fixed +} + +TEST_F(utX3DImportExport, importX3DChevyTahoe) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/X3D/Chevy/ChevyTahoe.x3d", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); + // TODO: CHANGE INCORRECT VALUE WHEN IMPORTER FIXED + // As noted in assimp issue 4992, X3D importer was severely broken with 5 Oct 2020 commit 3b9d4cf. + // ChevyTahoe.x3d should have 20 meshes but broken importer only has 19 + ASSERT_EQ(19u, scene->mNumMeshes); // Incorrect value from currently broken importer + ASSERT_NE(20u, scene->mNumMeshes); // Correct value, to be restored when importer fixed +} diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp index 807e3ca83..fe25199c1 100644 --- a/test/unit/utXImporterExporter.cpp +++ b/test/unit/utXImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index c29d17d33..bce57976a 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. @@ -897,6 +897,27 @@ TEST_F(utglTF2ImportExport, import_dracoEncoded) { ASSERT_EQ(strcmp(generator.C_Str(), "COLLADA2GLTF"), 0); } #endif + const aiScene *robotScene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/draco/robot.glb", + aiProcess_ValidateDataStructure); +#ifndef ASSIMP_ENABLE_DRACO + // No draco support, scene should not load + ASSERT_EQ(robotScene, nullptr); +#else + ASSERT_NE(robotScene, nullptr); + ASSERT_NE(robotScene->mMetaData, nullptr); + { + ASSERT_TRUE(robotScene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT)); + aiString format; + ASSERT_TRUE(robotScene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format)); + ASSERT_EQ(strcmp(format.C_Str(), "glTF2 Importer"), 0); + } + { + ASSERT_TRUE(robotScene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION)); + aiString version; + ASSERT_TRUE(robotScene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version)); + ASSERT_EQ(strcmp(version.C_Str(), "2.0"), 0); + } +#endif } TEST_F(utglTF2ImportExport, wrongTypes) { @@ -912,8 +933,8 @@ TEST_F(utglTF2ImportExport, wrongTypes) { TUPLE("/glTF2/wrongTypes/badString.gltf", "string", "name", "scenes[0]"), TUPLE("/glTF2/wrongTypes/badUint.gltf", "uint", "index", "materials[0]"), TUPLE("/glTF2/wrongTypes/badNumber.gltf", "number", "scale", "materials[0]"), - TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"), - TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]") + //TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"), + //TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]") #undef TUPLE }; for (const auto& tuple : wrongTypes) @@ -931,6 +952,28 @@ TEST_F(utglTF2ImportExport, wrongTypes) { } } +TEST_F(utglTF2ImportExport, wrongObject) { + // Deliberately broken version of the BoxTextured.gltf asset. + using tup_T = std::tuple<std::string, std::string, std::string, std::string>; + std::vector<tup_T> wrongTypes = { +#ifdef __cpp_lib_constexpr_tuple +#define TUPLE(x, y, z, w) \ + { x, y, z, w } +#else +#define TUPLE(x, y, z, w) tup_T(x, y, z, w) +#endif + TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"), + TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]") +#undef TUPLE + }; + for (const auto &tuple : wrongTypes) { + const auto &file = std::get<0>(tuple); + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR + file, aiProcess_ValidateDataStructure); + ASSERT_NE(scene, nullptr); + } +} + namespace { /// This class provides a fake schema to the GLTF importer. /// It just checks that the file has a top-level "scene" property which is an integer. diff --git a/test/unit/utglTFImportExport.cpp b/test/unit/utglTFImportExport.cpp index 9d1cebc54..71dc36c3e 100644 --- a/test/unit/utglTFImportExport.cpp +++ b/test/unit/utglTFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2024, assimp team +Copyright (c) 2006-2025, assimp team All rights reserved. |